다음을 고려하세요:
$ a='friend'
$ b='printf "%s\n" "$a"'
$ eval "$b"
friend
이는 완전히 안전해야 합니다. 그러나 $b
동일하지만 알려지지 않았다고 말할 수 있습니다 $a
. 그럼 안전상의 문제는 없나요? eval "$b"
그렇다면 이러한 위험을 완화하기 위해 어떤 조치를 취할 수 있습니까?
답변1
b
리터럴 문자열이 포함된 경우 , 즉 printf "%s\n" "$a"
사전에 확장하지 않은 경우에는 괜찮습니다. 정적 명령만 있으므로 왜 거기가 필요한지 잘 모르겠습니다. 직접 실행해 보세요.$a
eval "$b"
eval
printf "%s\n" "$a"
귀하는 귀하의 의견에서 나중에 사용할 수 있도록 일부 명령을 저장하고 싶다고 말했습니다. 이것이 바로 함수가 하는 일입니다. 예를 들어, printf
명령은 다음과 같은 함수가 될 수 있습니다.
println() {
printf "%s\n" "$1"
}
어떤 방식으로 실행 합니까 println "hello there"
? 은 함수의 첫 번째 매개변수이지만, 물론 대신 stdin을 읽거나 여러 매개변수를 사용할 수 있습니다( , , ...; 또는 모두 목록으로 포함 (유사 )).println "$a"
"$1"
"$2"
"$3"
"$@"
"${array[@]}"
마찬가지로, 더 긴 작업 세트의 경우:
#!/bin/bash
say_hi() {
echo "hello, $1"
}
louder() {
echo "$1!"
}
funcs=(say_hi louder)
names=(Huey Dewey Louie)
for name in "${names[@]}"; do
tmp=$name
for func in "${funcs[@]}"; do
tmp=$($func "$tmp")
done
echo "result: $tmp"
done