2017-08-09 8 views
1

私は/で区切られた文字列を持つコードを持っています。スペースはUNIX配列の区切り文字として扱われます

コードの最後の要素は「車&バイク」の値です しかし、コードはスペースを区切り文字として扱い、誤った出力を受け取ります。私はO/Pは次のよ​​うになりたい何

ARG="s3://this-is-my-bucket/Load/Data/Cars & Bikes" 
ARR=(${ARG//// }) 
S3=${ARR[0]} 
AWS=${ARR[1]} 
TYPE=${ARR[2]} 
FIELD=${ARR[3]} 
ITEM=${ARR[4]} 
echo $S3 
S3: 
echo $AWS 
this-is-my-bucket 
echo $TYPE 
Load 
echo $FIELD 
Data 
echo $ITEM 
Cars 

です:

は$ ITEMどれでも提案が高く評価され

車&バイクをエコー。

あなたが IFSとして /read -aを使用することができます
+0

引用符ではなくコードマークを使用してください。 – Barmar

+1

単語分割を防ぐために変数を引用します。 – Barmar

+0

正しい答えはhttps://unix.stackexchange.com/a/92188を参照してください。 – Theforgotten

答えて

2

:あなたは、配列の作成を回避し、直接このようIFS=/readで変数を使用することができます

s="s3://this-is-my-bucket/Load/Data/Cars & Bikes" 
IFS=/ read -ra arr <<< "$s" && declare -p arr 

declare -a arr=([0]="s3:" [1]="" [2]="this-is-my-bucket" [3]="Load" [4]="Data" [5]="Cars & Bikes") 

さも:

IFS=/ read -r s3 _ aws type field item <<< "$s" && declare -p s3 aws type field item 
declare -- s3="s3:" 
declare -- aws="this-is-my-bucket" 
declare -- type="Load" 
declare -- field="Data" 
declare -- item="Cars & Bikes" 
+0

ありがとう@anubhava。 IFSを使用すると、回帰の問題が発生します。あなたが言及したコードの直後には、さらに多くのコード行があります。ちなみに、そこにはUNIXパスに "/"があります。したがって、IFSをunixパスをデリミタとして扱うように設定することもできます。あなたは、IFSの使用をやめた後、IFSを/停止する方法を教えてください。 –

+1

'IFS = /'を 'read'と同じ行に置いてもグローバル' IFS'変数は設定されません。何らかの理由でグローバル 'IFS'を設定した場合は、' unset IFS'を使ってリセットしてください。 – anubhava

-1

設定IFS THWを変更するには空白からの単語区切り文字は/になります。単語を分割したくない場合は、変数を二重引用符で囲みます。 2 //s3:後にあるので、あなたは、次のフィールドを取得するために、配列のインデックスに1を追加する必要があること

ARG="s3://this-is-my-bucket/Load/Data/Cars & Bikes" 
IFS=/ 
ARR=($ARG) 
S3=${ARR[0]} 
AWS=${ARR[2]} 
TYPE=${ARR[3]} 
FIELD=${ARR[4]} 
ITEM=${ARR[5]} 
echo "$S3" 
echo "$AWS" 
echo "$TYPE" 
echo "$FIELD" 
echo "$ITEM" 

は注意してください。 IFSの複数のシーケンスは、IFSに標準の空白文字が含まれている場合にのみ、単一の区切り文字として扱われます。

ところで、大文字の変数名は使用しないでください。これらは環境変数を対象としています。

+0

@Barmer - s3の後には//が2つあります。だから、IFS = /はisseを解決しません。 –

+0

@ParijatBose良いキャッチ、私はそれのためのインデックスを調整しました。 – Barmar

関連する問題