【问题标题】:/bin/bash ternary var assignment [duplicate]/bin/bash 三元 var 赋值 [重复]
【发布时间】:2021-08-24 23:25:56
【问题描述】:

我早上大部分时间都在这,但必须工作,所以我回来了,希望有人能帮我解决这个问题。

这条线有效

 dest="$user@$dest:$( hostname )"
 # dest=me@remotehost.com:MyMachineHostname

这就像我真的很挣扎,我希望能够通过上传文件并设置一个 cron 作业在多个主机上运行它。

dir=$(( $unique == 1 ? ":"$( hostname ) : "" ))
dest="$user@$dest$dir"

当 unique == 1 时,冒号和主机名可以设置为 $dir,否则应该为空。

这绝对不是 PHP,要困难得多。

我尝试了许多不同的方括号,没有任何没有 $ 的大括号,我得到的最接近的是 :myhostname 但周围有很多其他字符。

这很令人沮丧。

【问题讨论】:

  • 三元运算符仅适用于算术上下文。它们包含的所有内容都必须是整数数学。您不能使用它们来替换字符串。
  • dir=$( (( unique )) && hostname ) 将是一种实现您所要求的方法,尽管从性能角度来看它有点棘手(但是,hostname 命令也是如此)
  • ...更好的实践方法就是if (( unique )); then dir=$HOSTNAME; fi。不需要三元组,使用内置变量$HOSTNAME$(hostname)(命令替换普遍很慢;启动外部命令也是如此)。
  • 顺便说一句,标题中的“日期”是什么?问题正文根本没有说明日期。
  • 感谢您的回复,对令人困惑的日期部分感到抱歉,除了运行日期函数外,它与主机名基本相同,我在写作时意识到如果一个正在工作我可以做另一个相同的名字,主机名更短,没有格式等,所以我选择询问那个。很高兴我做到了,我有一些好的答案要去做,同时在 cmets 中有一些代码改进。我会更新标题,现在。很抱歉造成混乱。

标签: bash ubuntu-20.04


【解决方案1】:
if (( unique )); then
  dir=:$(hostname)
fi
dest="$user@$dest$dir"

【讨论】:

  • 如果你打算使用 bash-only 语法,当上下文是算术时,为什么要使用 [[ ]] 而不是 (( ))if (( unique )); then 更短且更易于阅读,或者if (( unique == 1 )) 如果您想保持奇偶性并将所有其他正整数视为假。
  • (( )) 进行算术比较,对吧?
  • 对,(( ))进入算术上下文,所以(( unique ))是用算术规则评估unique,也就是说0为假,任何正数为真;当如上使用时,空字符串被视为零。 (而在if (( $unique )); then 中添加$ 会将空字符串视为错误,而不是将其视为零/假)。
  • 我完全同意你的看法。我不是那么精通,想尽可能地保持原味。 if (( unique )); then 是。
  • 对,但两种情况的规则不同。 (( somevar )) 确实扩展了 somevar,但它以一种比平时更努力地尝试将其视为数字的方式进行扩展。而(( $somevar )) 要求somevar 中的任何内容都已经成为一个有效的整数,它才能正常工作而不会引发错误。
猜你喜欢
  • 2021-05-25
  • 2011-03-06
  • 2017-07-09
  • 2013-08-13
  • 2012-12-15
  • 2021-08-27
  • 2019-05-24
  • 1970-01-01
  • 2015-12-03
相关资源
最近更新 更多