GNU/Linux >> Znalost Linux >  >> Linux

Jak přiřadit výstup příkazu proměnné shellu?

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í GNU ls ) 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 do ls a použijte head 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. Bez ls 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
Linux
  1. Jak připojit výstup do souboru?

  2. Jak zachovat konce řádků při ukládání výstupu příkazu do proměnné?

  3. Jak mohu zacyklit výstup příkazu shellu?

  1. Jak přiřadit výstup příkazu Linux k proměnné

  2. Jak spustit příkaz Vim z shellu?

  3. Skrýt výstup příkazu shellu pouze při úspěchu?

  1. Jak používat příkaz basename?

  2. Ukládání výstupu příkazu do proměnné Shell?

  3. Jak nastavit proměnnou rovnou výstupu z příkazu v Grub2?