bash 中是否存在用于退出代码扩展的 shorthand?
Does a shorthand exist in bash for exit code expansion?
我正在寻找一种方法来缩短这段代码以删除 echo $?部分。
case 0 in
$( [[ -e /path/to/file/a ]]; echo $?) ) echo a ;;
$( [[ -e /path/to/file/b ]]; echo $?) ) echo b ;;
esac
感觉 bash 应该有一种方法可以扩展到命令退出值,而不必包含额外的 echo 语句。
我花了 30 分钟谷歌搜索命令扩展,但我没有找到任何可以消除上述示例回声的东西。
可能这只是一厢情愿,但无论如何我都希望得到一个明确的答案或听到任何评论。
也许我遗漏了什么,但不会像
if [ -e /path/to/file/a ]; then
echo a
elif [ -e /path/to/file/b]; then
echo b
fi
或
for f in a b; do
if [ -e /path/to/file/"$f" ]; then
echo $f
break
fi
done
是更直接的方法吗?
如果您需要处理越来越多的位置列表,我特别喜欢第二种方法,因为它允许您在脚本的开头而不是代码中更深的地方定义列表:
locations=( '/path/to/file/a' '/path/to/file/b' )
或
declare -a locations=()
locations+=('/path/to/file/a')
locations+=('/path/to/file/b')
您可以通过在 if
语句中嵌套 case
语句以不同的方式处理不同的位置,这样它仅在该位置确实存在时才适用:
for f in "${locations[@]}"; do
if [ -e "$f" ]; then
case "$f" in
'/path/to/file/b')
su -c "..." - someuser
;;
*)
echo "$f"
;;
esac
break
fi
done
我正在寻找一种方法来缩短这段代码以删除 echo $?部分。
case 0 in
$( [[ -e /path/to/file/a ]]; echo $?) ) echo a ;;
$( [[ -e /path/to/file/b ]]; echo $?) ) echo b ;;
esac
感觉 bash 应该有一种方法可以扩展到命令退出值,而不必包含额外的 echo 语句。
我花了 30 分钟谷歌搜索命令扩展,但我没有找到任何可以消除上述示例回声的东西。
可能这只是一厢情愿,但无论如何我都希望得到一个明确的答案或听到任何评论。
也许我遗漏了什么,但不会像
if [ -e /path/to/file/a ]; then
echo a
elif [ -e /path/to/file/b]; then
echo b
fi
或
for f in a b; do
if [ -e /path/to/file/"$f" ]; then
echo $f
break
fi
done
是更直接的方法吗?
如果您需要处理越来越多的位置列表,我特别喜欢第二种方法,因为它允许您在脚本的开头而不是代码中更深的地方定义列表:
locations=( '/path/to/file/a' '/path/to/file/b' )
或
declare -a locations=()
locations+=('/path/to/file/a')
locations+=('/path/to/file/b')
您可以通过在 if
语句中嵌套 case
语句以不同的方式处理不同的位置,这样它仅在该位置确实存在时才适用:
for f in "${locations[@]}"; do
if [ -e "$f" ]; then
case "$f" in
'/path/to/file/b')
su -c "..." - someuser
;;
*)
echo "$f"
;;
esac
break
fi
done