我有一个 while 循环,它允许在以一种方式编写时设置变量,但在以另一种方式编写时不允许它。这是为什么?这将 var 打印为 1234 并且不打印 var2
#!/bin/bash
var=1234
while var=9876 var2=765 read line
do
echo $var $var2
echo $line
done <datafile
echo out of loop $var
Run Code Online (Sandbox Code Playgroud)
这将 var 打印为 9876 并打印 var2
#!/bin/bash
var=1234
while
var=9876
var2=765
read line
do
echo $var $var2
echo $line
done <datafile
echo out of loop $var
Run Code Online (Sandbox Code Playgroud) 我试图在一个条件之后执行多个命令,例如......
[ $VAR ] || echo "Error msg" ; echo "exit"
Run Code Online (Sandbox Code Playgroud)
和逆
[ -z $VAR ] && echo "Error msg" ; echo "exit"
Run Code Online (Sandbox Code Playgroud)
我知道这不会按预期工作,实际上我以前知道如何执行但忘记了如何执行此操作。我完全了解许多替代方案,例如使用if's 或通过()和括起来{}。使用()将创建一个不会退出正在运行的脚本的子进程。使用{}会起作用,但我知道存在一个更具可读性的替代方案。
我用 做了这个:,它是完美的!!!我现在一辈子都记不起来了,而且我丢失了以前写过的剧本。
如果有人知道如何用:'s写这个,我真的很感激任何帮助!
我有一个装满文件的文件夹,其.dot扩展名如下:
a.dot
b.dot
c.dot
Run Code Online (Sandbox Code Playgroud)
我想浏览此文件夹中的所有文件,并对它们运行如下命令:
dot -Tpdf a.dot -o a.pdf
dot -Tpdf b.dot -o b.pdf
dot -Tpdf c.dot -o c.pdf
Run Code Online (Sandbox Code Playgroud)
我猜我需要使用垂直条并执行如下命令:
ls *.dot | dot -Tpdf ... -o ....pdf
Run Code Online (Sandbox Code Playgroud)
但我不知道如何让管道只将每个文件放在中间部分。我应该使用xargs吗?此外,如何剥离扩展然后也将其放置在第二部分上。如果我至少可以指出正确的方向(使用哪个 shell 命令),它将帮助我在解决这个问题的过程中走得更远。
我正在整理一个简单的备份脚本,该脚本将压缩文件夹的内容,然后将该文件移动到备份服务器。该脚本确保 tar 文件存在并且在移动之前不是零字节。
问题是脚本在其中一条 IF 行上死掉了
if [ -f /www/archives/pdf/pdf_201207021048.tar && 11294720 -gt 0 ]; then
echo "tar file exists and is greater than 0 bytes."
else
echo "tar file does not exist or is zero bytes"
fi
Run Code Online (Sandbox Code Playgroud)
控制台中的错误是:
./backup_pdf.sh: line 49: [: missing `]'
Run Code Online (Sandbox Code Playgroud)
第 49 行是上面的 if 语句。
该脚本已成功验证
sh -n backup.sh
Run Code Online (Sandbox Code Playgroud)
sh看到丢失的“]”有什么问题,但它通过了语法检查?
在标题中的语句中,存在一个问题,即使该语句为真,它仍然会以状态 1 退出,因为据我了解:
[[ statement ]] || echo problem found ; exit 1
Run Code Online (Sandbox Code Playgroud)
评估如果语句为假,则发现回声问题。以状态 1 退出。即使该语句的计算结果为真,退出 1 仍会发生,因为它是独立的。我想通过在子shell中运行它来解决这个问题,如下所示:
[[ statement ]] || (echo problem found ; exit 1)
Run Code Online (Sandbox Code Playgroud)
这似乎符合我的要求,但这是一种可以接受的处理方式吗?
我可以在 bash 中做到这一点:
while read -n1 -r -p "choose [y]es|[n]o"
do
if [[ $REPLY == q ]];
then
break;
else
#whatever
fi
done
Run Code Online (Sandbox Code Playgroud)
这有效但似乎有点多余,我可以做这样的事情吗?
while [[ `read -n1 -r -p "choose [y]es|[n]o"` != q ]]
do
#whatever
done
Run Code Online (Sandbox Code Playgroud) 为了编译我的项目并检查它是否好,我想在 make 命令之后打印出状态消息。我应该使用哪一种?
make && echo “Success” || echo “Fail”
make || echo “Fail” && echo “Success”
make || echo “Success” && echo “Fail”
Run Code Online (Sandbox Code Playgroud)
我应该用第一个吧?
我有一个看起来像的 Bash 脚本
#!/bin/bash
#
FECHA=`date +%j`
if [ $FECHA -eq 40 ]
then
echo "Esta semana le toca preparar el café a Osvaldo" | mail -s 'Café' mailgroup@somedomain.mx
exit
elif [ $FECHA -eq 47 ]
then
echo "Esta semana le toca preparar el café a Berenice" | mail -s 'Café' mailgroup@somedomain.mx
exit
elif [ $FECHA -eq 54 ]
then
echo "Esta semana le toca preparar el café a Nizaá" | mail -s 'Café' mailgroup@somedomain.mx
exit
fi
Run Code Online (Sandbox Code Playgroud)
由于 crontab,它将在每周一早上 7 …
我想让一个类似清晰命令的列表更清晰易读,所以我做了一个小终端循环
for what in \
cache \
thumbs \
; do my template $what:clear; done
Run Code Online (Sandbox Code Playgroud)
它工作得很好,但是我想达到
my template cache:clear && my template thumbs:clear
Run Code Online (Sandbox Code Playgroud)
有没有一种方法可以轻松而明确地将&&放入这样的循环中,而无需将 if/else 语句添加到循环体检查最后一个命令退出代码并在非 0 时调用 break 的复杂性?
如果条件对你来说足够了:
for what in \
cache \
thumbs \
; do
my template $what:clear;
if [ $? -ne 0 ]; then break; fi \
; done
Run Code Online (Sandbox Code Playgroud) $!/bin/sh
if grep "$1" /etc/passwd 2>/dev/null #Search username at beging of line1
then
echo "Pattern found - Job Over"
else
echo "Pattern not found"
fi
Run Code Online (Sandbox Code Playgroud) control-flow ×10
shell ×7
bash ×4
scripting ×2
shell-script ×2
exit-status ×1
for ×1
grep ×1
pipe ×1
read ×1
test ×1
wildcards ×1