在UNIX阵列中将空间视为分隔符

时间:2017-08-09 14:19:07

标签: arrays linux shell unix

我有一段代码,其中我有一个由/。

分隔的字符串

代码的最后一个元素是“汽车与自行车”的值 但是代码将空格视为分隔符,输出错误。

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

我想要的o / p是什么

echo $ ITEM

汽车与汽车自行车

任何建议都表示赞赏。

2 个答案:

答案 0 :(得分:2)

您可以read -a使用/作为IFS

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")

否则你可以避免数组创建并直接在read中使用IFS=/使用变量:

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"

答案 1 :(得分:-1)

设置IFS以将字间隔符从空格更改为/。当你不想要分词时,将变量放在双引号中。

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"

请注意,由于//之后有两个s3:,因此您需要在数组索引中添加1以获取以下字段。当IFS包含标准空白字符时,IFS个字符的多个序列仅被视为单个分隔符。

顺便说一下,你应该避免使用大写的变量名。这些是针对环境变量的。