#!/bin/bash FILE="$(basename "$1")" FILE="${FILE/%.jpeg/.jpg}"
Je vůbec možné tyto dva řádky slepit do jedné linky?
Odpověď
FILE=$(basename "${1/%.jpeg/.jpg}")
pracoval pro mě.
test:
bash-$ ./test.sh /tmp/foo.jpeg foo.jpg
obsah skriptu:
bash-$ cat test.sh #!/usr/bin/bash FILE=$(basename "${1/%.jpeg/.jpg}") echo "$FILE"
Komentáře
Odpověď
Nemůžete“ vnořit “ expanze v bash (ani v ksh, ash a dalších skořápkách kromě zsh). Toto je pouze kosmetické omezení, protože jak ilustrujete, můžete dočasné proměnné přiřadit přechodný výraz. Je to trochu otravné pro jednorázové, ale ve skriptech je to pravděpodobně lepší pro čitelnost.
Dalo by se zabránit u zpívat externí nástroj basename
a místo toho použít konstrukt pro manipulaci s řetězci:
FILE="${1##*/}"; FILE="${FILE/%.jpeg/.jpg}"
Tady se stane, že můžete přepište svůj skript a vnějte substituci příkazu . To není obecný jev a nezískáte nic jiného než určitý pocit jedné linie.
Zsh, ať už k lepšímu nebo k horšímu, vám umožní vnořit expanze:
FILE=${$(basename $1)/%.jpeg/.jpg} # using basename FILE=${${1##*/}/%.jpeg/.jpg} # using string rewriting
Nebo můžete použít vestavěný konstrukt zsh místo basename
:
FILE=${${1:t}/%.jpeg/.jpg}
Odpověď
Chtěl bych:
FILE=$(basename $1 .jpeg).jpg
Druhým parametrem basename je přípona, která má být odstraněna z názvu souboru (viz man basename
)
Odpovědět
Můžete použít jeden sed
příkaz jako v následujícím:
FILE=$(sed "s/.*\///;s/\.jpeg$/.jpg/" <<<"$1")
Odpověď
Začlenění sed
by mělo stačit:
FILE="$(basename "$1" | sed s/\.jpeg$/.jpg/)"
(Toto přesně neodpovídá na vaši otázku, protože nemohu; nejsem si jistý, zda je to možné.)
Odpovědět
Bash konstrukty pracují s názvy proměnných , takže neexistuje žádný způsob, jak přímo vložit příkaz. Přístup @sr_ je alternativou, pokud vám nevadí extra vidlice.
Odpovědět
Řádek
FILE=$(basename "${1/%.jpeg/.jpg}")
lze zkrátit a učinit přenosnějším pomocí
FILE=$(basename "${1%.jpeg}.jpg")
sed
bude podle mě určitě potřeba.