このLinuxプログラムは0から4まで印刷する必要があります。しかし、このコードではエラーが見つかりません。
#!/bin/sh
a=0
while [ $a -lt 5 ]
do
echo $a
a='expr $a + 1'
done
実行しようとすると、「Line 5: [:Too Many Arguments」というメッセージが表示されます。
答え1
コマンドの置き換えにバックティックを使用できます。
a=`expr $a + 1`
答え2
私は3つの例を提供しました。最初の2つはwhile
ループがあり、3番目はuntil
ループがあります。最初の例は元の例と非常によく似た構文を使用し、3番目の例はカウンター最大値の動的設定と一度に1つの単語を繰り返すための配列(スペースで区切られた引数)を使用するため、少し複雑です。 。今これらはシンプルこの例は、Bashスクリプト言語のみを使用して直接の質問に答えるためのものです。より高度な例が必要な場合は、他のテクノロジウィザードのネストされたループの例について、GitHubが管理するスクリプトに添付されているリンクを参照してください。
実施例1
#!/usr/bin/env bash
let _counter=0
let _max="5"
while [ "${_counter}" -lt "${_max}" ]; do
echo "${_counter}"
let _counter=++
done
unset _counter
unset _max
例1 実行
./example_one.sh
1
2
3
4
5
実施例2
#!/usr/bin/env bash
_arr_args=( "${@}" )
let _counter=0
let _max="${#_arr_args[@]}"
while [ "${_counter}" -lt "${_max}" ]; do
echo "${_arr_args[${_counter}]}"
let _counter=++
done
unset _counter
unset _max
例2 実行
./example_two.sh "$(seq 1 5)"
## same output as example one
例3(補償)
#!/usr/bin/env bash
_arr_args=( "${@}" )
let _counter=0
let _max="${#_arr_args[@]}"
until [ "${_counter}" = "${_max}" ]; do
echo "${_arr_args[${_counter}]}"
let _counter=++
done
unset _counter
unset _max
例3 実行
./example_three.sh "$(seq 1 5)"
## same output as example one
新しい Bash スクリプト作成者の注意事項
- 組み込みの変数/配列と代替規則を見つけることで、時間と労力を節約し、他のプログラムへの不要な接続を避けることができます。
shellcheck
作成者はソースコードとして提供し、GitHubを介してCode Climateに統合され、ほとんどのディストリビューションで利用可能です。- 上から避けたようにここにリンク自動コードチェックで上記の両方のループタイプを使用するサンプルスクリプトです。ただし、スクリプトの意図は上記の質問に答える以上のものなので、これらの呼び出しを利用する関連関数を見つけるには、「while」と「until」を検索してください。
bash
!=sh
類似点はありますが、違いがあります。私は個人的にbashが良い選択だと思います。 shスクリプトが与えられると、シェルがbash構文で奇妙なことをするため、間違っている可能性が少ないからです。
答え3
'expr $a + 1'
aに文字列を割り当てています。これはあなたが望むものではありません。一重引用符をバックティックに変更するだけです。
a=`expr $a + 1`
上記はあなたの質問に答えます。以下はいくつかの追加のアイデアです。
実装がBashの場合は、代わりにバックティックの/bin/sh
使用を検討することもできます$(...)
。これにはいくつかの利点があります。一重引用符とバックティックの間の印刷上の混乱を防ぎ、フォームを入れ子にすること$(...)
ができ、各入れ子は独自の引用文脈にあります。次のことができます。
variable="$(somecommand -o "$file")"
別の実装は次のとおりです。
#/bin/bash
declare -i a=0
while [[ $a -lt 5 ]]; do
echo $a
((a++))
done
これはsh
実装ではありません。したがって、あなたの質問に安全に答えるために、あなたの意図にPOSIXの移植性が含まれているのか、またはそのような特定の実装に興味があるのかをBash
知る必要がありますdash
。tcsh