変数に文字列として定義された2つのコマンドを組み合わせて、1つのコマンドとして実行します。

変数に文字列として定義された2つのコマンドを組み合わせて、1つのコマンドとして実行します。

文字列で定義された2つのコマンドを組み合わせて1つのコマンドとして実行できますか?例えば

var="ls -alt"
var2="| grep usersfile"
var3="| grep usersfolder"

次の接続コマンドの例は機能しません。

ㅏ。'{$var & $var2;}'

雨。'{$var & $var3;}'

私は何ですか:

ㅏ。走って"$var $var2"取得してください"ls -alt | grep usersfile"

または

b。走って"$var $var3"手に入れてください。"ls -alt | grep usersfolder"

答え1

はい、を使用してこれを実行できますeval

$ var="ls -alt"
$ var2="| grep usersfile"
$ var3="| grep usersfolder"
$ eval "$var$var2"
< Output of ls -alt | grep userfile >
$ eval "$var$var3"
< Output of ls -alt | grep usersfolder >

答え2

おそらくこうしてはいけないと思います。実際に達成したい作業に応じて他のオプションがあります。

検索文字列を選択する動的オプションが必要な場合は、次のことができます。

#!/bin/bash
pattern=$1

ls -alt | grep "${pattern:-.}"

最初の位置引数が何であるか、引数が指定されていない場合に検索します。

または、特定の条件下で措置を講じたい場合:

#!/bin/bash

cmd=(ls -alt)
p1=usersfile
p2=usersfolder

if [[ condition1 ]]; then
    p=$p1
elif [[ condition2 ]]; then
    p=$p2
fi

"${cmd[@]}" | grep "$p"

または関数から:

#!/bin/bash

ls_func () {
    local p=$1
    ls -alt | grep "${p:-.}"
}

while getopts p:c: opt; do
    case $opt in
        c)  command=$OPTARG;;
        p)  pattern=$OPTARG;;
    esac
done

if [[ $command == 'ls' ]]; then
    ls_func "$pattern"
fi

関連情報