标签: control-flow

为什么换行符会弄乱我的 while 条件?

我有一个 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)

shell bash environment-variables control-flow

4
推荐指数
1
解决办法
540
查看次数

Shell 条件后的多个命令列表、&amp;&amp;、||。Shell 脚本,破折号

我试图在一个条件之后执行多个命令,例如......

[ $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写这个,我真的很感激任何帮助!

shell control-flow

4
推荐指数
2
解决办法
1747
查看次数

如何在一组文件上迭代命令?

我有一个装满文件的文件夹,其.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 命令),它将帮助我在解决这个问题的过程中走得更远。

shell pipe wildcards control-flow

4
推荐指数
1
解决办法
664
查看次数

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看到丢失的“]”有什么问题,但它通过了语法检查?

shell shell-script control-flow

4
推荐指数
1
解决办法
9891
查看次数

Bash:处理“[[statement ]] || echo problem found ; exit 1”逻辑

在标题中的语句中,存在一个问题,即使该语句为真,它仍然会以状态 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)

这似乎符合我的要求,但这是一种可以接受的处理方式吗?

scripting bash control-flow

4
推荐指数
1
解决办法
675
查看次数

如何使用用户输入作为 while 循环条件

我可以在 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)

shell bash control-flow test read

4
推荐指数
1
解决办法
2万
查看次数

Bash 打印出 make 结果

为了编译我的项目并检查它是否好,我想在 make 命令之后打印出状态消息。我应该使用哪一种?

make && echo “Success” || echo “Fail”
make || echo “Fail” && echo “Success”
make || echo “Success” && echo “Fail”
Run Code Online (Sandbox Code Playgroud)

我应该用第一个吧?

shell bash control-flow

3
推荐指数
1
解决办法
1389
查看次数

很多elif,有没有更好的方法?

我有一个看起来像的 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 …

shell-script control-flow

3
推荐指数
2
解决办法
994
查看次数

是否可以在终端命令模板循环中使用 &amp;&amp; 运算符?

我想让一个类似清晰命令的列表更清晰易读,所以我做了一个小终端循环

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)

shell control-flow for exit-status

3
推荐指数
1
解决办法
158
查看次数

以下脚本中的脚本 2&gt;/dev/null 有什么用?

$!/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)

grep scripting io-redirection control-flow

3
推荐指数
1
解决办法
1万
查看次数