Chci přiřadit výsledek výrazu
(tj. výstup z příkazu)
k proměnné a poté s ní manipulovat – například
jej zřetězit s řetězcem a poté jej echo .
Tady je to, co mám:
#!/bin/bash
cd ~/Desktop;
thefile= ls -t -U | grep -m 1 "Screen Shot";
echo "Most recent screenshot is: "$thefile;
Ale výstup:
Screen Shot 2011-07-03 at 1.55.43 PM.png
Most recent screenshot is:
Takže to vypadá, že to není přiřazeno k $thefile
, a právě se tiskne.
Co mi chybí?
Přijatá odpověď:
Přiřazení shellu je jedno slovo bez mezery za rovnítkem. Takže to, co jste napsali, přiřadí thefile
prázdnou hodnotu; navíc, protože je přiřazení seskupeno s příkazem, vytváří thefile
proměnná prostředí a přiřazení je lokální pro tento konkrétní příkaz, tj. pouze volání ls
vidí přiřazenou hodnotu.
Chcete zachytit výstup příkazu, takže musíte použít substituci příkazu:
thefile=$(ls -t -U | grep -m 1 "Screen Shot")
(Některá literatura uvádí alternativní syntaxi thefile=`ls …`
; syntaxe backquote je ekvivalentní syntaxi dolarových závorek kromě toho, že citace uvnitř zpětných uvozovek jsou někdy divné, takže stačí použít $(…)
.)
Další poznámky k vašemu skriptu:
-
Kombinace
-t
(seřadit podle času) pomocí-U
(netříděte pomocí GNUls
) nedává smysl; stačí použít-t
. -
Spíše než pomocí
grep
pro porovnání snímků obrazovky je jasnější předat zástupný znak dols
a použijtehead
pro zachycení prvního souboru:thefile=$(ls -td -- *"Screen Shot"* | head -n 1)
-
Obecně je špatný nápad analyzovat výstup
ls
. To může selhat docela špatně, pokud máte názvy souborů s netisknutelnými znaky. Bezls
je však řazení souborů podle data obtížné , takže je to přijatelné řešení, pokud víte, že v názvech souborů nebudete mít netisknutelné znaky nebo zpětná lomítka. -
Vždy používejte dvojité uvozovky kolem náhrad proměnných , tedy sem napište
echo "Most recent screenshot is: $thefile"
Bez dvojitých uvozovek je hodnota proměnné znovu rozšířena, což způsobí potíže, pokud obsahuje mezery nebo jiné speciální znaky.
-
Nepotřebujete středníky na konci řádku. Jsou nadbytečné, ale neškodné.
-
Ve skriptu shellu je často dobré zahrnout
set -e
. To říká shellu, aby skončil, pokud některý příkaz selže (vrácením nenulového stavu).
Pokud máte GNU find
a sort
(zejména pokud používáte neembedded Linux nebo Cygwin), existuje jiný způsob, jak najít nejnovější soubor:find
vypište soubory a jejich data a použijte sort
a read
(zde za předpokladu bash
nebo zsh
pro -d ''
číst záznam oddělený NUL) k extrahování nejmladšího souboru.
IFS=/ read -rd '' ignorovaný soubor <<( najít -maxdepth 1 -type f -name "*Snímek obrazovky*" -printf "%[e-mail chráněný]/%p
Jak smazat soubor, jehož jméno začíná „-“ (pomlčka A.k.a. pomlčka nebo minus)?
Jak funguje vstup z klávesnice a textový výstup?
Linux