0

Bourne Shell スクリプトに渡されたコマンド ライン引数を出力するように unix に指示しようとしていますが、うまくいきません。目的の場所にあるコマンド ライン引数ではなく、echo ステートメントで x の値を取得します。

これは私が欲しいものです:

./abcd を実行

あいうえお

これは私が得るものです:

1 2 3 4

どうしたの?シェル スクリプトで参照しているもの (変数 x または x 番目の位置にあるコマンド ライン引数) に従って、UNIX が混乱していることはわかっています。

#!/bin/sh
x=1
until [ $x -gt $# ]
do
echo $x
x=`expr $x + 1`
done

編集: 回答ありがとうございますが、別の質問があります。最初の引数ではなく、2 番目または 3 番目の引数でカウントを開始したい場合はどうすればよいでしょうか? では、2 番目の位置から始まる要素を処理し、最初の位置を無視するように UNIX に指示するにはどうすればよいでしょうか?

4

4 に答える 4

1

あなたが要求したことを実行するためのスクリプトへの最も簡単な変更は次のとおりです。

#!/bin/sh
x=1
until [ $x -gt $# ]
do
    eval "echo \${$x}"
    x=`expr $x + 1`
done

ただし(これは大きな問題ですが)、eval を (特にユーザー入力で) 使用することは、セキュリティ上の大きな問題です。より良い方法は、次のようにシフトと最初の位置引数変数を使用することです。

#!/bin/sh

while [ $# -gt 0 ]; do
    x=$1
    shift
    echo ${x}
done
于 2010-10-14T00:31:43.440 に答える
1

第2引数のカウントを開始したい場合

for i in ${@:2}
do
  echo $i
done
于 2010-10-14T00:59:30.657 に答える
1
echo $*

$x は x 番目の引数ではありません。これは変数 x でありexpr $x+1、他の言語の x++ に似ています。

于 2010-10-14T00:22:52.817 に答える
0

を使用しないソリューションshift:

#!/bin/sh

for arg in "$@"; do
  printf "%s " "$arg"
done
echo
于 2010-10-14T00:39:20.367 に答える