변수에 문자열로 정의된 두 명령을 결합하여 하나의 명령으로 실행합니다.

변수에 문자열로 정의된 두 명령을 결합하여 하나의 명령으로 실행합니다.

문자열로 정의된 두 명령을 결합하여 하나의 명령으로 실행할 수 있습니까? 예를 들어

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

관련 정보