쉘 스크립트의 변수에 명령을 저장하는 방법은 무엇입니까?
나중에 사용할 명령을 변수에 저장하고 싶습니다 (명령의 출력이 아니라 명령 자체).
다음과 같은 간단한 스크립트가 있습니다.
command="ls";
echo "Command: $command"; #Output is: Command: ls
b=`$command`;
echo $b; #Output is: public_html REV test... (command worked successfully)
그러나 조금 더 복잡한 것을 시도하면 실패합니다. 예를 들어
command="ls | grep -c '^'";
출력은 다음과 같습니다.
Command: ls | grep -c '^'
ls: cannot access |: No such file or directory
ls: cannot access grep: No such file or directory
ls: cannot access '^': No such file or directory
나중에 사용할 수 있도록 이러한 명령 (파이프 / 다중 명령 포함)을 변수에 저장하는 방법에 대한 아이디어가 있습니까?
eval 사용 :
x="ls | wc"
eval "$x"
y=$(eval "$x")
echo "$y"
마십시오 하지 사용 eval
! 임의의 코드가 실행될 위험이 있습니다.
BashFAQ-50- 변수에 명령을 넣으려고하는데 복잡한 경우는 항상 실패합니다.
배열에 넣고 큰 따옴표 "${arr[@]}"
로 모든 단어를 확장 하여 단어 분할 로 인해 단어 가 분할 되지 않도록합니다 .IFS
cmdArgs=()
cmdArgs=('date' '+%H:%M:%S')
내부 배열의 내용을 확인하십시오. 을 declare -p
사용하면 각 명령 매개 변수를 사용하여 별도의 인덱스로 배열의 내용을 볼 수 있습니다. 그러한 인수 중 하나에 공백이 포함 된 경우 배열에 추가하는 동안 내부를 인용하면 Word-Splitting으로 인해 분할되지 않습니다.
declare -p cmdArgs
declare -a cmdArgs='([0]="date" [1]="+%H:%M:%S")'
다음과 같이 명령을 실행하십시오.
"${cmdArgs[@]}"
23:15:18
(또는) 모두 bash
함수를 사용 하여 명령을 실행합니다.
cmd() {
date '+%H:%M:%S'
}
다음과 같이 함수를 호출하십시오.
cmd
POSIX sh
에는 배열이 없으므로 가장 가까운 방법은 위치 매개 변수에 요소 목록을 작성하는 것입니다. 다음 sh
은 메일 프로그램을 실행 하는 POSIX 방법입니다.
# POSIX sh
# Usage: sendto subject address [address ...]
sendto() {
subject=$1
shift
first=1
for addr; do
if [ "$first" = 1 ]; then set --; first=0; fi
set -- "$@" --recipient="$addr"
done
if [ "$first" = 1 ]; then
echo "usage: sendto subject address [address ...]"
return 1
fi
MailTool --subject="$subject" "$@"
}
이 접근 방식은 리디렉션없이 간단한 명령 만 처리 할 수 있습니다. 리디렉션, 파이프 라인, for / while 루프, if 문 등을 처리 할 수 없습니다.
var=$(echo "asdf")
echo $var
# => asdf
Using this method, the command is immediately evaluated and it's return value is stored.
stored_date=$(date)
echo $stored_date
# => Thu Jan 15 10:57:16 EST 2015
# (wait a few seconds)
echo $stored_date
# => Thu Jan 15 10:57:16 EST 2015
Same with backtick
stored_date=`date`
echo $stored_date
# => Thu Jan 15 11:02:19 EST 2015
# (wait a few seconds)
echo $stored_date
# => Thu Jan 15 11:02:19 EST 2015
Using eval in the $(...)
will not make it evaluated later
stored_date=$(eval "date")
echo $stored_date
# => Thu Jan 15 11:05:30 EST 2015
# (wait a few seconds)
echo $stored_date
# => Thu Jan 15 11:05:30 EST 2015
Using eval, it is evaluated when eval
is used
stored_date="date" # < storing the command itself
echo $(eval "$stored_date")
# => Thu Jan 15 11:07:05 EST 2015
# (wait a few seconds)
echo $(eval "$stored_date")
# => Thu Jan 15 11:07:16 EST 2015
# ^^ Time changed
In the above example, if you need to run a command with arguments, put them in the string you are storing
stored_date="date -u"
# ...
For bash scripts this is rarely relevant, but one last note. Be careful with eval
. Eval only strings you control, never strings coming from an untrusted user or built from untrusted user input.
- Thanks to @CharlesDuffy for reminding me to quote the command!
For bash, store your command like this:
command="ls | grep -c '^'"
Run your command like this:
echo $command | bash
Its is not necessary to store commands in variables even as you need to use it later. just execute it as per normal. If you store in variable, you would need some kind of eval
statement or invoke some unnecessary shell process to "execute your variable".
참고URL : https://stackoverflow.com/questions/5615717/how-to-store-a-command-in-a-variable-in-a-shell-script
'developer tip' 카테고리의 다른 글
SQL Server를 사용하여 문자열을 자르는 방법 (0) | 2020.08.25 |
---|---|
largeHeap을 true로 설정하면 어떤 이점이 있습니까? (0) | 2020.08.25 |
Heroku 애플리케이션 DNS를 Godaddy 도메인에 구성하는 방법은 무엇입니까? (0) | 2020.08.25 |
Python 생성자 및 __init__ (0) | 2020.08.25 |
폴더에서 하위 모듈 저장소를 만들고 git 커밋 기록을 유지합니다. (0) | 2020.08.25 |