如果file
为0或1,我尝试打印$files
,如果大于1,则尝试打印files
。在bash中执行此操作的简洁方法是什么?
我尝试使用' printf'如下,
files=13;
printf 'There are %s file%s' $files $(($files > 1 ? 's' : ''))
正如预期的那样,这并没有成功。
有人可以告诉我如何实现这个目标吗?
答案 0 :(得分:2)
如果只是在file
和files
之间进行选择,您可以这样做,虽然它不像人们想的那样简洁:
printf "The search found %d file%.*s.\n" $files $((files != 1)) "s"
但是在OP的声明中,您还需要将are
更改为is
以维护动词/对象协议。在这种情况下,使用条件几乎肯定更容易和更易读,但您可以使用数组:
formats=("is %d file" "are %d files")
printf "There ${formats[files!=1]}.\n" $files
答案 1 :(得分:1)
创建一个这样的条件:
printf 'There are %s file%s\n' $files $( [ $files -gt 1 ] && echo "s")
使用$( [ $files -gt 1 ] && echo "s" || echo "")
我们打开一个shell,在其中检查值。如果条件匹配,则打印s
。
要同时处理is/are
,您还可以添加其他条件:
printf 'There %s %s file%s\n' $( [ $files -eq 1 ] && echo "is" || echo "are" ) $files $( [ $files -gt 1 ] && echo "s")
$ files=0
$ printf 'There are %s file%s\n' $files $( [ $files -gt 1 ] && echo "s")
There are 0 file
$ files=1
$ printf 'There are %s file%s\n' $files $( [ $files -gt 1 ] && echo "s")
There are 1 file
$ files=15
$ printf 'There are %s file%s\n' $files $( [ $files -gt 1 ] && echo "s")
There are 15 files
答案 2 :(得分:0)
由于%b
格式说明符解释反斜杠转义符,您仍然可以使用?
运算符替换单个字符。
$ files=1
$ printf 'Removed %s file%b\n' $files \\$(($files > 1 ? 163 : 0))
Removed 1 file
$ files=15
$ printf 'Removed %s file%b\n' $files \\$(($files > 1 ? 163 : 0))
Removed 15 files