Ale*_*lex 123 bash loops do-while
在Bash中模拟do-while循环的最佳方法是什么?
我可以在进入while
循环之前检查条件,然后继续重新检查循环中的条件,但这是重复的代码.有更干净的方式吗?
我的脚本的伪代码:
while [ current_time <= $cutoff ]; do
check_if_file_present
#do other stuff
done
Run Code Online (Sandbox Code Playgroud)
check_if_file_present
如果在$cutoff
时间之后启动,这将不会执行,并且会执行.
jm6*_*666 200
两个简单的解决方
在while循环之前执行一次代码
actions() {
check_if_file_present
# Do other stuff
}
actions #1st execution
while [ current_time <= $cutoff ]; do
actions # Loop execution
done
Run Code Online (Sandbox Code Playgroud)要么:
while : ; do
actions
[[ current_time <= $cutoff ]] || break
done
Run Code Online (Sandbox Code Playgroud)Pau*_*ce. 140
while
在测试之前和之后放置环体.while
循环的实际主体应该是无操作.
while
check_if_file_present
#do other stuff
(( current_time <= cutoff ))
do
:
done
Run Code Online (Sandbox Code Playgroud)
continue
如果您发现更可读,则可以使用冒号而不是冒号.您还可以插入仅在迭代之间(不是在第一次之前或之后)之间运行的命令,例如echo "Retrying in five seconds"; sleep 5
.
我将测试更改为使用双括号,因为您似乎在比较整数.例如,在双方括号内,比较运算符<=
是词法,并且在比较2和10时会给出错误的结果.那些操作符不能在单个方括号内工作.
这个实现:
do=true
while $do || conditions; do
do=false
# your code ...
done
Run Code Online (Sandbox Code Playgroud)
它也适用于读取循环,跳过第一次读取:
do=true
while $do || read foo; do
do=false
# your code ...
echo $foo
done
Run Code Online (Sandbox Code Playgroud)
小智 7
如果您发现更可读,则可以使用continue,而不是冒号
这种方法模仿了我正在寻找的Do-While循环的方式 - 在动作之后进行条件测试.我还发现我可以在do语句之后放置索引增量(如果需要),而不是continue语句.
while
check_if_file_present
#do other stuff
(( current_time <= cutoff ))
do
(( index++ ));
done
Run Code Online (Sandbox Code Playgroud)
我们可以while [[condition]]; do true; done
像这样在 Bash 中模拟 do-while 循环:
while [[ current_time <= $cutoff ]]
check_if_file_present
#do other stuff
do true; done
Run Code Online (Sandbox Code Playgroud)
举个例子。这是我在 bash 脚本中获取ssh 连接的实现:
#!/bin/bash
while [[ $STATUS != 0 ]]
ssh-add -l &>/dev/null; STATUS="$?"
if [[ $STATUS == 127 ]]; then echo "ssh not instaled" && exit 0;
elif [[ $STATUS == 2 ]]; then echo "running ssh-agent.." && eval `ssh-agent` > /dev/null;
elif [[ $STATUS == 1 ]]; then echo "get session identity.." && expect $HOME/agent &> /dev/null;
else ssh-add -l && git submodule update --init --recursive --remote --merge && return 0; fi
do true; done
Run Code Online (Sandbox Code Playgroud)
它将按顺序给出输出,如下所示:
Step #0 - "gcloud": intalling expect..
Step #0 - "gcloud": running ssh-agent..
Step #0 - "gcloud": get session identity..
Step #0 - "gcloud": 4096 SHA256:XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX /builder/home/.ssh/id_rsa (RSA)
Step #0 - "gcloud": Submodule '.google/cloud/compute/home/chetabahana/.docker/compose' (git@github.com:chetabahana/compose) registered for path '.google/cloud/compute/home/chetabahana/.docker/compose'
Step #0 - "gcloud": Cloning into '/workspace/.io/.google/cloud/compute/home/chetabahana/.docker/compose'...
Step #0 - "gcloud": Warning: Permanently added the RSA host key for IP address 'XXX.XX.XXX.XXX' to the list of known hosts.
Step #0 - "gcloud": Submodule path '.google/cloud/compute/home/chetabahana/.docker/compose': checked out '24a28a7a306a671bbc430aa27b83c09cc5f1c62d'
Finished Step #0 - "gcloud"
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
142862 次 |
最近记录: |