Bashスクリプトで作業ディレクトリを分割する

Bashスクリプトで作業ディレクトリを分割する

私がするなら:

IFS="/" read -ra PARTS

パスを手動で入力すると、期待どおりに「PARTS」配列が作成されますが、次のようになります。

IFS="/" read -ra PARTS <<< $(pwd)

単一要素を含む配列を作成し、スラッシュを空白に変換します。

現在の作業ディレクトリを配列に分割する方法は?

答え1

コマンドを引用すると機能します。

IFS="/" read -ra PARTS <<< "$(pwd)"
for i in "${PARTS[@]}"
do
  printf '%s\n' "$i"
done

home
user1

答え2

質問です。

現在の作業ディレクトリを配列に分割する方法は?

(「職場にどのように行きますか?」の代わりに)IFS="something" read -a arrayname <<< $(command)

saveIFS="$IFS"; IFS=/ PARTS=($(pwd)); IFS="$saveIFS"

はい、わかりました。頑張った

IFS=/ PARTS=($(pwd))

そして

コマンド全体を...またはで囲んでも、まだにIFS設定されています。もちろん、それを含めると…メインシェルに設定されなくなります。/{;}eval()PARTS

IFS=/ declare PARTS=($(pwd))

さらに失敗しました。

最初のコードブロック(saveIFS)はIFSの以前の値を保存し、それを復元します(変更後)。ただし、以前にIFSが設定されていない場合、上記のコードはIFSを空の文字列(通常は空の文字列と呼びます)に設定します。ご使用の環境にこのような状況が存在し、IFS をセットアップ解除状態に戻すには、次のようにします。

checkIFS="${IFS+1}"
saveIFS="$IFS"
IFS=/ PARTS=($(pwd))
if [ "$checkIFS" ]
then
    IFS="$saveIFS"
else
    unset IFS
fi

(または1行にすべて)

checkIFS="${IFS+1}"; saveIFS="$IFS"; IFS=/ PARTS=($(pwd)); if [ "$checkIFS" ]; then IFS="$saveIFS"; else unset IFS; fi

ここでcheckIFSIFSが設定されていない場合は1に設定され、IFSがnullに設定されている場合はい置く。次に、IFSを以前の(設定)/(オフに設定)状態に復元し、以前の値(存在する場合)を復元する明確なテストを実行します。

もちろん、環境を変更せずに維持することに興味がある場合(変数を除くPARTScheckIFSsaveIFS

関連情報