GNU/Linux >> Znalost Linux >  >> Linux

Jak uložit příkaz do proměnné v shell skriptu?

Použijte eval:

x="ls | wc"
eval "$x"
y=$(eval "$x")
echo "$y"

Ne použijte eval ! Má velké riziko zavedení libovolného spouštění kódu.

BashFAQ-50 – Snažím se vložit příkaz do proměnné, ale složité případy vždy selžou.

Vložte jej do pole a rozbalte všechna slova dvojitými uvozovkami "${arr[@]}" ne nechte IFS rozdělte slova kvůli dělení slov.

cmdArgs=()
cmdArgs=('date' '+%H:%M:%S')

a podívejte se na obsah pole uvnitř. declare -p umožňuje zobrazit obsah pole uvnitř s každým parametrem příkazu v samostatných indexech. Pokud jeden takový argument obsahuje mezery, citace uvnitř při přidávání do pole zabrání jeho rozdělení kvůli dělení slov.

declare -p cmdArgs
declare -a cmdArgs='([0]="date" [1]="+%H:%M:%S")'

a proveďte příkazy jako

"${cmdArgs[@]}"
23:15:18

(nebo) použijte dohromady bash funkce pro spuštění příkazu,

cmd() {
   date '+%H:%M:%S'
}

a zavolejte funkci jako just

cmd

POSIX sh nemá žádná pole, takže nejblíže, co můžete udělat, je vytvořit seznam prvků v pozičních parametrech. Zde je POSIX sh způsob, jak spustit poštovní program

# POSIX sh
# Usage: sendto subject address [address ...]
sendto() {
    subject=$1
    shift
    first=1
    for addr; do
        if [ "$first" = 1 ]; then set --; first=0; fi
        set -- "[email protected]" --recipient="$addr"
    done
    if [ "$first" = 1 ]; then
        echo "usage: sendto subject address [address ...]"
        return 1
    fi
    MailTool --subject="$subject" "[email protected]"
}

Všimněte si, že tento přístup dokáže zpracovat pouze jednoduché příkazy bez přesměrování. Neumí zpracovat přesměrování, potrubí, smyčky for/while, příkazy if atd

Dalším běžným případem použití je spuštění curl s více poli záhlaví a užitečného zatížení. Vždy můžete definovat argumenty jako níže a vyvolat curl na rozšířeném obsahu pole

curlArgs=('-H' "keyheader: value" '-H' "2ndkeyheader: 2ndvalue")
curl "${curlArgs[@]}"

Další příklad,

payload='{}'
hostURL='http://google.com'
authToken='someToken'
authHeader='Authorization:Bearer "'"$authToken"'"'

nyní, když jsou proměnné definovány, použijte pole k uložení argumentů příkazu

curlCMD=(-X POST "$hostURL" --data "$payload" -H "Content-Type:application/json" -H "$authHeader")

a teď udělejte pořádnou citovanou expanzi

curl "${curlCMD[@]}"

var=$(echo "asdf")
echo $var
# => asdf

Pomocí této metody je příkaz okamžitě vyhodnocen a jeho návratová hodnota je uložena.

stored_date=$(date)
echo $stored_date
# => Thu Jan 15 10:57:16 EST 2015
# (wait a few seconds)
echo $stored_date
# => Thu Jan 15 10:57:16 EST 2015

Totéž s backtick

stored_date=`date`
echo $stored_date
# => Thu Jan 15 11:02:19 EST 2015
# (wait a few seconds)
echo $stored_date
# => Thu Jan 15 11:02:19 EST 2015

Použití eval v $(...) nebude vyhodnocena později

stored_date=$(eval "date")
echo $stored_date
# => Thu Jan 15 11:05:30 EST 2015
# (wait a few seconds)
echo $stored_date
# => Thu Jan 15 11:05:30 EST 2015

Pomocí eval se vyhodnotí, když eval se používá

stored_date="date" # < storing the command itself
echo $(eval "$stored_date")
# => Thu Jan 15 11:07:05 EST 2015
# (wait a few seconds)
echo $(eval "$stored_date")
# => Thu Jan 15 11:07:16 EST 2015
#                     ^^ Time changed

Pokud ve výše uvedeném příkladu potřebujete spustit příkaz s argumenty, vložte je do řetězce, který ukládáte

stored_date="date -u"
# ...

Pro bash skripty je to zřídka relevantní, ale poslední poznámka. Buďte opatrní s eval . Vyhodnoťte pouze řetězce, které ovládáte, nikdy řetězce pocházející od nedůvěryhodného uživatele nebo vytvořené z nedůvěryhodného uživatelského vstupu.

  • Děkuji @CharlesDuffy za připomenutí, abych citoval příkaz!

Linux
  1. Jak spustíme příkaz uložený v proměnné?

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

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

  1. Jak získat vlastní IP adresu a uložit ji do proměnné ve skriptu Shell?

  2. Jak zacházet s přepínači ve skriptu Shell?

  3. Jak odložit variabilní expanzi?

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

  2. Jak vytvořit skript příkazu Linux

  3. Jak uložit výsledek provedeného příkazu shellu do proměnné v pythonu?