select
ユーザーは環境の画面にある番号リストからファイルをインポートしたいと思いますmkinitcpio
busybox
ash
。リストは上から下に塗りつぶすか、並べ替えて列で印刷する必要があります。たとえば、次のようになります。
1) 2017-12-17 3) 2017-12-19 5) 2017-12-21 7) 2017-12-23 9) 2017-12-25
2) 2017-12-18 4) 2017-12-20 6) 2017-12-22 8) 2017-12-24
1行ずつ画面に印刷していますprintf
。だから私は通常配列を使用します。busybox
ash
配列サポートが不足しているため、位置引数(など)を使用してset
貧しい人の配列を作成するのがハッキングです。$1=2017-12-17
$2=2017-12-18
次に、次を使用して位置パラメータ値を取得します。
file=$(eval echo \$$i)
検索するより良い方法はありますか?n番目の位置パラメータ存在する禁煙健康増進協会?
ノート
- 上記の列は単純化された例です。実際のファイル名にはタイムスタンプも含まれます(例:
2017-12-27-060056
。 - Mkinitcpio busybox 1.27.2 コンパイルの構成。
答え1
使用:
eval "file=\${$i}"
コマンドの置換は必要ありません。末尾の改行の削除中にデータが破損し、フォーク()とパイプライン()が含まれ、それらのパイプを介して2つのプロセス間でデータがプッシュされるため、非効率的です。
echo
また、任意のデータに適用しないでください。
また、9より大きい数字のPOSIX sh構文に必要な中括弧に注意してください。
$i
ユーザーから読んだ場合は、コマンド注入の脆弱性を避けるために、sまたはsの前に$#
1から1までの10進整数であることを確認することをお勧めします。0
+
valid() { # args: string min max
case $1 in
(*[!0123456789]* | 0* | "" | ??????????*) return 1
esac
[ "$1" -ge "$2" ] && [ "$1" -le "$3" ]
}
until
printf>&2 'Enter number: '
IFS= read -r number
valid "$number" 1 "$#"
do
echo>&2 "Not a valid number. Please try again."
done
eval "file=\${$number}"
答え2
パンを使用できます。評価よりこれが良いですね。
猫は忙しいです。
leshift () {
shift "$1"
echo "$1"
}
echo param debut
echo $#
echo $@
for i in "$@" ; do
echo "$i"
done
echo param shift
read a # number from 1 to 5
b=$(leshift "$a" "$@")
echo $b
echo param fin
echo $#
echo $@
for i in "$@" ; do
echo "$i"
done
君はただそう呼んでる
./busy.sh a b 'c h' d e