【解決方法】ループが別のループ内にも存在するループ内に存在する関数からユーザー入力を読み取る


#!/ビン/バッシュ

やあみんな

だから私は難問に座っています…別のループに存在するループから関数を呼び出そうとしています。 問題は、2 つのループが入力を待機しないことです…それらは単に実行を継続し、必要なユーザー入力が無視され、関数が失敗します。 したがって、基本的に、関数を呼び出してユーザーにプロンプ​​トを表示する方法を探しています…そして答えを使用して、関数を4つのオプションのいずれかを実行するように誘導します。

「ループで関数を呼び出し、それが完了するのを待ってからbashを続行する」、「bashを続行する前にループ内で関数が完了するのを待つ」、「bashで条件が満たされるまでループを停止する」などをグーグルで検索しました

したがって、基本的なレイアウトは次のようになります

# これは、より大きなスクリプトの一部を形成する関数内にあります

'bash'
while IFS='\n' read -r line; do 
  while IFS1=' ' read -r part_name part_size part_uuid mount_point; do
    if [[ ${part_uuid} = "" ]]; then 
          FORMAT_FUNCTION ${part_name}
     fi
   done
 done

# これは上から呼び出される別の関数です

'bash'
function FORMAT_FUNCTION {
  local_partition=${1}
  if [[ ! ${local_partition} = "" ]]; then
        echo "Next we need to select the Filesystem type"
        echo ""
        echo "1 - ext2"
        echo "2 - ext3"
        echo "3 - ext4"
        echo "4 - fat"
        read -n1 -r -p "Please enter a option from above" key
        if [[ ${key} = "1" ]]; then
              sudo mkfs -t ext2 /dev/${local_partition}
            elif  [[ ${key} = "2" ]]; then
              sudo mkfs -t ext3 /dev/${local_partition}
            elif  [[ ${key} = "3" ]]; then
              sudo mkfs -t ext4 /dev/${local_partition}
            elif  [[ ${key} = "4" ]]; then
              sudo mkfs -t vfat /dev/${local_partition}
         fi
   fi              
}

私が試したこと:

そのため、PID を使用して (関数の完了を待機する追加のループを使用して)、組み込みの待機関数を使用しようとしましたが、成功しませんでした。 サブプロセスの使用を検討しましたが、それらを正しく実行するために必要な構文を完全に理解していないのではないかと心配しています

解決策 2

だから私はアプローチを変えました…従来のループシステムの代わりに、人工的なものを作成しました。
「lsblk -o NAME,SIZE,UUID,MOUNTPOINT | grep ${activeDevice}」の前後に「diff」コマンドを使用して別のファイルに出力し、それをファイルに出力した後、「$ (head -n 1 lsblk_diff | awk ‘{print $1}’)” を diff ファイルに追加して、編集したパーティションの名前を特定し、新しい関数を作成しました。 if ステートメントと最初の 2 つのファイルを grep コマンドと共に使用する新しい関数で、${partName} 変数をローカル変数に読み取り、それらを比較します。 次に、「sed -i “https://www.codeproject.com/””${partName}”‘/d’ lsblk_diff」を使用して、「lsblk_diff」ファイルから行を削除しました。 使用される “if [[ ! $(cat lsblk_diff) = “” ]]; then” 関数をリコールし、進行を強制するループがなくなったため、残りは機能しています

コメント

タイトルとURLをコピーしました