実施例1

実施例1

この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知る必要がありますdashtcsh

関連情報