`ash`でn番目(インデックス付き)位置引数の値を取得するより良い方法は `eval echo \ $ $ n`です。

`ash`でn番目(インデックス付き)位置引数の値を取得するより良い方法は `eval echo \ $ $ n`です。

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番目の位置パラメータ存在する禁煙健康増進協会


ノート

  1. 上記の列は単純化された例です。実際のファイル名にはタイムスタンプも含まれます(例:2017-12-27-060056
  2. 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

関連情報