232

私はbashスクリプトについて混乱しています。

次のコードがあります。

function grep_search() {
    magic_way_to_define_magic_variable_$1=`ls | tail -1`
    echo $magic_variable_$1
}

コマンドの最初の引数を含み、たとえばの最後の行の値を持つ変数名を作成できるようにしたいと考えていますls

だから私が欲しいものを説明するために:

$ ls | tail -1
stack-overflow.txt

$ grep_search() open_box
stack-overflow.txt

では、どのように定義/宣言$magic_way_to_define_magic_variable_$1し、スクリプト内でどのように呼び出す必要がありますか?

eval${...}、を試し\$${...}ましたが、まだ混乱しています。

4

19 に答える 19

309

私は最近、それを行うためのより良い方法を探していました。連想配列は、私にとってやり過ぎのように思えました。私が見つけたものを見て:

suffix=bzz
declare prefix_$suffix=mystr

...その後...

varname=prefix_$suffix
echo ${!varname}
于 2013-08-08T11:00:08.380 に答える
193

コマンド名をキーとして、連想配列を使用します。

# Requires bash 4, though
declare -A magic_variable=()

function grep_search() {
    magic_variable[$1]=$( ls | tail -1 )
    echo ${magic_variable[$1]}
}

連想配列を使用できない場合 (たとえば、bash3 をサポートする必要がある場合)、declare動的変数名を作成するために使用できます。

declare "magic_variable_$1=$(ls | tail -1)"

間接的なパラメーター展開を使用して値にアクセスします。

var="magic_variable_$1"
echo "${!var}"

BashFAQ: Indirection - Evaluating indirect/reference variablesを参照してください。

于 2013-05-14T21:43:30.150 に答える
10

ここで評価の高い2つの回答を組み合わせて、うまくいけば便利で自明な完全な例にします。

#!/bin/bash

intro="You know what,"
pet1="cat"
pet2="chicken"
pet3="cow"
pet4="dog"
pet5="pig"

# Setting and reading dynamic variables
for i in {1..5}; do
        pet="pet$i"
        declare "sentence$i=$intro I have a pet ${!pet} at home"
done

# Just reading dynamic variables
for i in {1..5}; do
        sentence="sentence$i"
        echo "${!sentence}"
done

echo
echo "Again, but reading regular variables:"
echo $sentence1
echo $sentence2
echo $sentence3
echo $sentence4
echo $sentence5

出力:

家でペットの猫を飼ってい
ます 家でニワトリを飼ってい
ます 家で牛を飼ってい
ます 家で犬を飼って
います家でペットの豚

繰り返しますが、通常の変数を読んでください:
ご存知のとおり、私は家でペットの猫を飼っ


ますhome
ほら、家で豚を飼ってる

于 2020-11-26T11:31:30.197 に答える
2

うわー、構文のほとんどはひどいです! 配列を間接的に参照する必要がある場合の、より単純な構文を使用した 1 つのソリューションを次に示します。

#!/bin/bash

foo_1=(fff ddd) ;
foo_2=(ggg ccc) ;

for i in 1 2 ;
do
    eval mine=( \${foo_$i[@]} ) ;
    echo ${mine[@]}" " ;
done ;

より単純な使用例については、 Advanced Bash-Scripting Guideで説明されている構文をお勧めします。

于 2017-01-05T02:14:54.767 に答える
0

KISS アプローチ:

a=1
c="bam"
let "$c$a"=4
echo bam1

結果は 4

于 2021-06-12T02:39:24.233 に答える
-3

フォーマットには、次を使用しvarname=$prefix_suffixます。

varname=${prefix}_suffix
于 2015-01-13T09:28:53.297 に答える