微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

在bash中使用内联if语句添加命令参数

只有当变量求值为某个值时,我才想在bash中为命令添加一个参数.例如,这有效:
test=1
if [ "${test}" == 1 ]; then
    ls -la -R
else
    ls -R   
fi

这种方法的问题在于,当test为1或者是其他东西时,我必须复制ls -R.我更愿意,如果我可以在一行中写这个,而不是这样(伪代码不起作用):

ls (if ${test} == 1 then -la) -R

我尝试了以下但它不起作用:

test=1
ls `if [ $test -eq 1 ]; then -la; fi` -R

这给了我以下错误

./test.sh: line 3: -la: command not found
一个更惯用的版本 svlasov’s answer
ls $( (( test == 1 )) && printf %s '-la' ) -R

由于echo本身可以理解一些选项,因此使用printf%s确保要打印的文本不会被误认为是一个选项更安全.
请注意,此处不得引用命令替换 – 这在当前情况下是正常的,但通常需要更强大的方法 – 请参阅下文.

但是,一般来说,更健壮的方法是在数组中构建参数并将其作为一个整体传递:

# Build up array of arguments...
args=()
(( test == 1 )) && args+=( '-la' )
args+=( '-R' )

# ... and pass it to `ls`.
ls "${args[@]}"

更新:OP询问如何有条件地添加一个额外的,基于变量的参数来产生ls -R -la“$PWD”.
在这种情况下,数组方法是必须的:每个参数必须成为自己的数组元素,这对于支持可能嵌入空格的参数至关重要:

(( test == 1 )) && args+= ( '-la' "$PWD" ) # Add each argument as its own array element.

至于为什么你的命令,

ls `if [ $test -eq 1 ]; then -la; fi` -R

不起作用:

反引号(或其现代的,可嵌套的等价物,$(…))之间的命令 – 一个所谓的command substitution – 就像任何其他shell命令一样执行(虽然在子shell中)并且整个构造被替换为命令的stdout输出.

因此,您的命令尝试执行字符串-la,该字符串失败.要将其发送到stdout,这里需要使用echo或printf等命令.

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


用的openwrt路由器,家里宽带申请了动态公网ip,为了方便把2280端口映射到公网,发现经常被暴力破解,自己写了个临时封禁ip功能的脚本,实现5分钟内同一个ip登录密码错误10次就封禁这个ip5分钟,并且进行邮件通知使用步骤openwrt为19.07.03版本,其他版本没有测试过安装bashmsmtpopkg
#!/bin/bashcommand1&command2&wait从Shell脚本并行运行多个程序–杨河老李(kviccn.github.io)
1.先查出MAMP下面集成的PHP版本cd/Applications/MAMP/bin/phpls-ls 2.编辑修改.bash_profile文件(没有.bash_profile文件的情况下回自动创建)sudovim~/.bash_profile在文件的最后输入以下信息,然后保存退出exportPATH="/Applications/MAMP/bin/php/php7.2.20/b
1、先输入locale-a,查看一下现在已安装的语言2、若不存在如zh_CN之类的语言包,进行中文语言包装:apt-getinstalllanguage-pack-zh-hans3、安装好后我们可以进行临时修改:然后添加中文支持: locale-genzh_CN.UTF-8临时修改> export LC_ALL='zh_CN.utf8'> locale永久
BashPerlTclsyntaxdiff1.进制数表示Languagebinaryoctalhexadecimalbash2#[0~1]0[0~7]0x[0~f]or0X[0~f]perl0b[0~1]0[0~7]0x[0~f]tcl0b[0~1]0o[0~7]0x[0~f]bashdifferentbaserepresntationreference2.StringlengthLanguageStr
正常安装了k8s后,使用kubect工具后接的命令不能直接tab补全命令补全方法:yum-yinstallbash-completionsource/usr/share/bash-completion/bash_completionsource<(kubectlcompletionbash)echo"source<(kubectlcompletionbash)">>~/.bashrc 
参考这里启动jar包shell脚本修改过来的#!/bin/bash#默认应用名称defaultAppName='./gadmin'appName=''if[[$1&&$1!=0]]thenappName=$1elseappName=$defaultAppNamefiecho">>>>>>本次重启的应用:$appName<
#一个数字的行#!/bin/bashwhilereadlinedon=`echo$line|sed's/[^0-9]//g'|wc-L`if[$n-eq1]thenecho$linefidone<1.txt#日志切割归档#!/bin/bashcd/data/logslog=1.logmv_log(){[-f$1]&&mv$1$2
#文件增加内容#!/bin/bashn=0cat1.txt|whilereadlinedon=[$n+1]if[$n-eq5]thenecho$lineecho-e"#Thisisatestfile.\n#Testinsertlineintothisfile."elseecho$linefidone#备份/etc目录#
# su - oraclesu: /usr/bin/ksh: No such file or directory根据报错信息:显示无法找到文件 /usr/bin/ksh果然没有该文件,但是发现存在文件/bin/ksh,于是创建了一个软连接,可以规避问题,可以成功切换到用户下,但无法执行系统自带命令。$. .bash_profile-ksh: .: .b