Bashスクリプトで動作する方法は次のとおりです。
PACKAGES=(
'curl'
'git'
'htop'
'mc'
'tree'
'vim'
)
apt --yes install ${PACKAGES[@]}
しかし、POSIXで同じことを行い、#!/bin/sh
スクリプトで使用できるようにするにはどうすればよいですか?
答え1
POSIXsh
シェルには1つの配列しかありません($@
位置パラメータ配列、つまり$1
、、$2
...)。次のコマンドを使用してその値を設定できますset
。
set -- curl git htop mc tree vim
またはコマンドラインから:
./myscript.sh curl git htop mc tree vim
次に、
apt --yes install "$@"
参照を拡張すると、$@
配列はその参照に展開されます。リーダー要素つまり、$@
配列に合計が含まれているa word
場合は、another word
その"$@"
項目に展開されます。二つひも。引用しない場合は、$@
次に展開されます。4つ文字列a
、および.word
引用符なしの動作は内容によって異なります。another
word
$IFS
Taiではbash
二重引用符拡張が必要です${PACKAGES[@]}
。
apt --yes install "${PACKAGES[@]}"
あなたはしません本物しかし、ここでは「要素をスペースで連結」します。はい、echo
値の間にスペースがありますが、これは違いです。
set -- a b c d
printf '>%s<\n' "$@"
これは
>a<
>b<
>c<
>d<
(4つの個々のパラメータが欲しいものです。)
そして
printf '>%s<' "$*"
これは
>a b c d<
(要素を持つパラメータスペースでつながる(コマンドで実際に使用したい文字で$IFS
はなく、最初の文字)apt install
答え2
持っているのはパッケージ名なので、標準シェルを使用したい場合は、単純な文字列変数に保存できます。少なくともDebian のマニュアルによると、パッケージ名には文字のみを含めることができ、-+.:~a-z0-9A-Z
グローバル文字やスペースはありません。
したがって、次は大丈夫でしょう。
#!/bin/sh
packages="curl git htop ..."
IFS=" " # make sure there's nothing weird here
apt --yes install $packages # no quotes!
妄想がある場合は、set -f
ファイル名のグロービングを無効にするには、先頭に追加します。これは空白のみの問題として残りますが、正気のシステムではパッケージ名に空白を許可しないと思います。