![](/img/trans.png)
[英]Shell Script: how to read a text file that does not end with a newline on Windows
[英]shell script - exit inside read statement does not end the script
我有一個名為 test1 的簡單虛擬腳本
#!/bin/sh
echo "Starting ..."
. ./test2.sh
bring_data
this_is_it
echo "...Done"`
`
它調用另一個腳本(注意我們不是在這里生成,而是采購)
#!/bin/sh
MY_DATA=\
"john road usa
adrian avenue nigeria
arthur street brazil
bill roads canada"
create_my_data() {
echo "name = ${1} type = ${2} country = ${3}"
if [ "${2}" = "avenue" ]; then
echo "failed... kick me out"
exit 2
fi
}
zombies_are() {
printf "%s" "${1}" | while read -r guy_name lives_on country; do
create_my_data "${guy_name}" "${lives_on}" "${country}"
done
}
bring_data() {
zombies_are "${MY_DATA}"
}
this_is_it() {
echo "... more work has to be done..."
sleep 1
echo "..."
}
由於 test1.sh 正在采購 test2.sh...我希望調用 exit 2 會終止整個腳本調用。 我希望調用 that_is_it... 不會發生...但它確實發生了。
這一行有什么特別之處嗎: while read -r guy_name lives_on country; do
while read -r guy_name lives_on country; do
` 不允許從調用 test1.sh 中完全退出???
這是此時的 output:
# ./test1.sh
Starting ...
name = john type = road country = usa
name = adrian type = avenue country = nigeria
failed... kick me out
... more work has to be done...
...
...Done
我把代碼改成了這個...
`zombies_are "${MY_DATA}" || 出口 2'
現在可以了。
我將代碼更改為:
bring_data() { zombies_are "${MY_DATA}" || exit 2 }
由於 pipe ( |
), while
循環在另一個子 shell 中生成。 exit
命令退出這個子 shell。 你可以用這個最小的腳本試試這個: sh -c 'exit; echo hi'
sh -c 'exit; echo hi'
與sh -c ': | exit; echo hi'
sh -c ': | exit; echo hi'
sh -c ': | exit; echo hi'
。
一個解決方案是使用進程替換來保持 while 循環在同一個 shell 中:
zombies_are() {
while read -r guy_name lives_on country; do
create_my_data "${guy_name}" "${lives_on}" "${country}"
done < <(printf "%s" "${1}")
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.