whileループでネストされた変数をテストする

whileループでネストされた変数をテストする

whileループ条件でネストされた変数を挿入しようとしていますが、正しく拡張できません。

print_message() {
    timer=0
    timer_condition="$2"

    while [[ $timer_condition ]]; do
        sleep 1
        timer=$((timer+1))
    done
    echo "$1"
}

print_message 'Hello world, 5 seconds passed...' '$timer != "5"'
print_message 'Hello again, another 10 seconds passed...' '$timer != "10"'

たとえば、私は2つのパラメータを受け取る単純な関数print_messageを作成しました。 $ 1は印刷するメッセージで、$ 2はメッセージを表示するために関数に異なる条件を提供できるようにwhileループでテストする条件です。ただし、whileループはコンテンツではなく、$timer_condition自体がtrueかどうかをテストします。このように動作させる方法はありますか?

while [[ $timer != "5" ]]; do

ありがとう

答え1

目的のタスクを実行する1つの方法は次のとおりです。

print_message() {
    timer=0
    timer_condition="$2"

    while (( $timer_condition ))
    do
        sleep 1
        (( timer += 1 ))
    done
    echo "$1"
}

print_message 'Hello world, 5 seconds passed...' 'timer != 5'
print_message 'Hello again, another 10 seconds passed...' 'timer != 10'

~

答え2

あなたはそれを使用することができますeval

評価:評価[パラメータ...]

パラメーターをシェルコマンドとして実行します。

ARGを単一の文字列に結合し、結果をシェルへの入力として使用し、結果コマンドを実行します。

終了ステータス:コマンドの終了ステータスを返すか、コマンドが空の場合は成功を返します。

説明するために設計された例:

foo=bar
expr='[[ $foo == bar ]]'
if eval "$expr"; then
  echo 'foo is equal to "bar"'
fi

スクリプトを'[[ $timer != 5 ]]'パラメータとして渡して使用するには

while eval "$timer_condition"; do

しかし、参考にしてください。eval 注意して使用する必要があります気をつけないと悪用されやすいからです。

答え3

渡す条件がls -1 | grep demo既存のファイルの場所であると仮定すると、次のコードスニペットが機能します。demo

print_message() {
    condition="$2"

    if eval "$condition" > /dev/null
    then
        echo "$1"
    fi
}

print_message 'Found' 'ls -1 | grep demo'

関連情報