在 Bash shell 脚本中,以下两个语句之间有什么区别(如果有)?
if [ -z "$1" ]
if [ "$1" = "" ]
我发现自己在一些脚本中编写了第二个脚本,但后来我在这里读到使用-z
实现了同样的事情。
如果使用第二个有问题,我们是否应该忽略第一个看起来更好一点?
如何使用 date 命令将诸如“monday week 40”之类的内容转换为 ISO 日期?
我正在玩这样的事情:
date --date='monday week 40' +'%Y-%m-%d'
Run Code Online (Sandbox Code Playgroud)
我要搜索的日期是 2011-10-03。
但是我的问题是这个日期字符串无效,所以我需要另一种方法来解决这个问题。
/谢谢
当我阅读有关 $? 另一个问题浮现在脑海中。
是否有关于如何使用 $ 的最佳实践?在 bash 中?
让我们举个例子:
我们有一个线性脚本,我想知道所有命令都执行正常。你认为调用一个小函数(我们称之为“did_it_work”)来检查错误代码是否可以,如果不是就中断。
#!/bin/bash
function did_it_work {
code=$1
if [ "$code" -ne "0" ]
then
echo "Error failure: code $code "
exit 1
fi
}
dir=some/path
mkdir -p $dir
did_it_work $?
cd $dir
did_it_work $?
run_some_command
did_it_work $?
Run Code Online (Sandbox Code Playgroud)
这种方法当然意味着我必须手动解决问题(如果有的话)并重新运行脚本。
您认为这是一个好主意还是有其他一些最佳实践可以做到这一点?
/谢谢
为什么“she-bang”以#!
,开头#!/bin/bash
?我一直接受这是如何完成的,但这背后有什么原因吗?
为什么从#
;开始 这不是通常的评论吗?或者它应该是评论的重点?
使用 grep -r 时,您可以使用 * 或 . 它似乎返回了同样的东西,但它真的一样吗?
假设我搜索“foo”,然后我可以写
grep -r foo *
Run Code Online (Sandbox Code Playgroud)
或者
grep -r foo .
Run Code Online (Sandbox Code Playgroud)
有人会尝试解释 . 和 *?
我正在编写一个小脚本来修改目录树中的一些电影,我想用 bash for 循环或类似方法解析该树。
所以我开始寻找文件
find -iname *.mov -or -iname *.mkv -or -iname *.avi
Run Code Online (Sandbox Code Playgroud)
他按预期向我展示了各种文件。
但是然后我尝试用这个循环结果(因为某些目录名称中有空格)。
find -iname *.mov -or -iname *.mkv -or -iname *.avi -print0 | while read -d $'\0' line
do
echo $line
done
Run Code Online (Sandbox Code Playgroud)
但现在他只返回avi文件!所以当我添加 -print0 时,他似乎忽略了我的 -or 和另一个 -iname。
这里发生了什么,我错过了什么?
在循环结果之前,我是否需要将 find 的结果发送到 tmpfile 中?
背后隐藏着什么奇怪的shell语法,它是$((40-35))
如何计算值的?
例子:
$> echo $((40-35))
5
Run Code Online (Sandbox Code Playgroud) bash ×3
shell ×3
arithmetic ×1
date ×1
find ×1
grep ×1
history ×1
shebang ×1
shell-script ×1
wildcards ×1