如何在shell中比较两个日期?
这是我想如何使用它的示例,尽管它不能按原样工作:
todate=2013-07-18
cond=2013-07-15
if [ $todate -ge $cond ];
then
break
fi
Run Code Online (Sandbox Code Playgroud)
我怎样才能达到预期的结果?
我有一个 shell 脚本,其中有以下几行if [ -z "$xyz" ]和if [ -n "$abc" ],但我不确定它们的目的是什么。谁能解释一下?
这可能与检测操作系统有关,但我特别需要系统上当前使用的 init 系统。
Fedora 15 和 Ubuntu 现在使用 systemd,Ubuntu 过去使用 Upstart(很长时间默认直到 15.04),而其他人使用 System V 的变体。
我有一个应用程序,我正在编写它作为跨平台守护程序。初始化脚本是根据可以在配置时传入的参数动态生成的。
我想做的只是为他们正在使用的特定初始化系统生成脚本。这样,安装脚本可以在没有参数的情况下以 root 身份合理运行,并且守护进程可以自动“安装”。
这是我想出的:
这样做的最佳跨/平台方式是什么?
有点相关,我可以依赖 bash 来支持大多数 *nix 还是依赖于发行版/操作系统?
目标平台:
我刚刚在初始化脚本中看到了这一点:
echo $"Stopping Apache"
Run Code Online (Sandbox Code Playgroud)
那个美元符号是干什么用的?
我在 bash 手册中找到了这个:
引述
如果设置,
$'string'并且在双引号括起来的扩展中$"string"执行${parameter}引用。默认情况下启用此选项。
...但我没有发现带$前缀和不带前缀的字符串之间有任何区别:
$ echo "I am in $PWD"
I am in /var/shared/home/southworth/qed
$ echo $"I am in $PWD"
I am in /var/shared/home/southworth/qed
$ echo $"I am in ${PWD}"
I am in /var/shared/home/southworth/qed
$ echo "I am in ${PWD}"
I am in /var/shared/home/southworth/qed
$ echo 'I am in ${PWD}'
I am in ${PWD}
$ echo $'I am in ${PWD}'
I am in ${PWD} …Run Code Online (Sandbox Code Playgroud) 最近,我偶然发现了一种我以前从未见过的多行注释类型——这是一个脚本示例:
echo a
#
: aaa
: ddd
#
echo b
Run Code Online (Sandbox Code Playgroud)
这似乎有效,甚至vim语法突出显示它。这种评论风格是什么,我如何找到有关它的更多信息?
我目前正在探索 Debian 软件包,并且我一直在阅读一些代码示例。例如,postinst脚本中的每一行都是一个模式。
some command || true
another command || true
Run Code Online (Sandbox Code Playgroud)
因此,如果某些命令失败,则该行返回 true,但我看不出这会如何影响程序的输出。
我想将表达式的结果(即命令的输出)分配给一个变量,然后对其进行操作——例如,将它与一个字符串连接起来,然后回显它。这是我所拥有的:
#!/bin/bash
cd ~/Desktop;
thefile= ls -t -U | grep -m 1 "Screen Shot";
echo "Most recent screenshot is: "$thefile;
Run Code Online (Sandbox Code Playgroud)
但是输出:
Screen Shot 2011-07-03 at 1.55.43 PM.png
Most recent screenshot is:
Run Code Online (Sandbox Code Playgroud)
因此,它看起来没有分配给$thefile,并且在执行时正在打印。
我错过了什么?
我有一个程序可以生成有用的信息,stdout但也可以从stdin. 我想将其标准输出重定向到一个文件,而不在标准输入上提供任何内容。到目前为止,很好:我可以做到:
program > output
Run Code Online (Sandbox Code Playgroud)
并且不要在 tty 中做任何事情。
但是,问题是我想在后台执行此操作。如果我做:
program > output &
Run Code Online (Sandbox Code Playgroud)
程序将被挂起(“挂起(tty 输入)”)。
如果我做:
program < /dev/null > output &
Run Code Online (Sandbox Code Playgroud)
程序立即终止,因为它到达 EOF。
似乎我需要的是将program某些内容导入到无限期不执行任何操作且不读取的内容中stdin。以下方法有效:
while true; do sleep 100; done | program > output &
mkfifo fifo && cat fifo | program > output &
tail -f /dev/null | program > output &
Run Code Online (Sandbox Code Playgroud)
然而,这一切都非常难看。有有是一种优雅的方式,使用标准的Unix工具,以“什么都不做,无限期”(意译man true)。我怎么能做到这一点?(我这里优雅的主要标准:没有临时文件;没有忙碌等待或定期唤醒;没有异国情调的实用程序;尽可能短。)
我已经创建了一个 bash 脚本,但是当我尝试执行它时,我得到
#!/bin/bash no such file or directory
Run Code Online (Sandbox Code Playgroud)
我需要运行命令:bash script.sh让它工作。
我怎样才能解决这个问题?
我显然明白可以为内部字段分隔符变量添加值。例如:
$ IFS=blah
$ echo "$IFS"
blah
$
Run Code Online (Sandbox Code Playgroud)
我也明白这read -r line会将数据保存stdin到名为的变量line:
$ read -r line <<< blah
$ echo "$line"
blah
$
Run Code Online (Sandbox Code Playgroud)
但是,命令如何分配变量值?它是否首先存储来自stdinto 变量的数据line,然后赋予lineto 的值IFS?
shell-script ×10
bash ×6
date ×1
executable ×1
init ×1
portability ×1
quoting ×1
scripting ×1
shebang ×1
shell ×1
stdin ×1
stdout ×1
variable ×1