簡體   English   中英

shell 腳本 - exit inside read 語句不會結束腳本

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM