如何使用条件参数的printf

时间:2015-02-04 12:59:51

标签: bash printf

如果file为0或1,我尝试打印$files,如果大于1,则尝试打印files。在bash中执行此操作的简洁方法是什么?

我尝试使用' printf'如下,

files=13;
printf 'There are %s file%s' $files $(($files > 1 ? 's' : ''))

正如预期的那样,这并没有成功。

有人可以告诉我如何实现这个目标吗?

3 个答案:

答案 0 :(得分:2)

如果只是在filefiles之间进行选择,您可以这样做,虽然它不像人们想的那样简洁:

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