나는 이 코드를 가지고 있습니다 :
#!/bin/bash
num=${1:-undefined}
cmd=$(which {banner,echo} | head -n1)
until [[ "$num" =~ ^[0-9]+$ ]]; do
read -p "Type a number: " num
done
for ((num;num>=0;num--)); do
$cmd $num
sleep 1
done
하지만 프로그램이 설치되어 있는지 알 수 있는 더 좋은 방법이 있다고 생각합니다. 나는 이것을 시도했습니다. 그러나 나는 그것이 명확하지 않다고 생각합니다.
which banner && cmd=banner || cmd=echo
cmd=$(eval 'which '{banner,echo}'||' :)
cmd=$(which {banner,echo} | head -n1)
cmd=$(which banner || which echo)
나는 다른 것보다 3을 선호하지만 누군가가 이 작업을 수행하는 좋은 방법을 찾는 데 도움을 줄 수 있다고 생각했습니다. type
또는 필요한 경우 hash
사용 을 수락합니다 .command
이것은 간결한 코드 챌린지이므로 한 줄로 만들고 짧게 유지하고 변수 이름이나 명령( ||
, &&
등은 제외) 을 반복하지 않으려고 했습니다.
답변1
함수 기반 접근 방식은 가장 명확한 코드를 생성합니다. 적어도 두 가지 변형이 가능하며, 그 중 하나는 FloHim이 위의 댓글에서 제안한 것입니다(이것은 제가 좋아하는 방식이 아닙니다).
function myprint
{
if type banner >/dev/null
then banner "$@"
else echo "$@"
fi
}
myprint "Hello World!"
또는 - 내가 선호하는 변형 - 사용조건부 함수 정의:
if type banner >/dev/null
then function myprint { banner "$@" ;}
else function myprint { echo "$@" ;}
fi
myprint "Hello World!"
if
호출별 조건부 오버헤드가 없으며 문자열이나 변수 표현식을 반복할 필요가 없습니다(다른 제안에서처럼).
답변2
가장 쉬운 방법은 달리는 것입니다
command1 "hello world" || command2 "hello world"
첫 번째 명령이 없으면 왼쪽 명령이 ||
실패하므로 오른쪽 명령이 실행됩니다. 왜 먼저 테스트를 해야 하는지 이해가 안 됩니다. 그냥 해보고, 실패하면 다른 일을 하세요.
누락된 명령으로 인한 오류 메시지를 무시하고 중복 문자열을 피하면 상황이 약간 더 나아질 수 있습니다.
string="Hello world!"
banner "$string" || echo "$string"
명령이 존재하는지 정말로 확인해야 한다면 다음과 같이 하세요.
command="banner"
type "$command" 2>/dev/null || command="echo"
"$command" "Hello world!"
답변3
zsh
명령을 해당 경로에 매핑하는 특수 연관 배열 에서 $commands
다음을 수행할 수 있습니다.
cmd=${commands[figlet]-${commands[banner]-echo}}
유틸리티 경로가 있는 경우 해당 경로로 설정하고, 다른 경로로 설정하고, 둘 다 없으면 (내장) 로 $cmd
설정하는 데 사용됩니다 .figlet
banner
echo
figlet
banner
$cmd
변수( ) 대신 명령을 정의할 수 있습니다.
hash cmd=${commands[figlet]-${commands[banner]-$commands[echo]}}
echo
여기서는 내장 유틸리티가 아닌 독립 실행형 유틸리티로 끝나게 됩니다 . 또한 hash -r
aka 에서는 hash 명령이 사라집니다 rehash
.