0

私はこのスクリプトを書きましたが、明らかに問題はありません。

#!/bin/bash

DATA=/home/badouble/STORE/rawData_v1r0
LOGS=/home/badouble/bABaReC/CDAS_Selection_log

for dir in $DATA/*/
do
     dir=${dir%*/}
     echo $dir
     ARR=$(echo $dir | tr "/" " ")
     echo ${ARR[1]}   

 done

しかし、以下のように、目的の出力が生成されません。

/home/badouble/STORE/rawData_v1r0/2011-12

/home/badouble/STORE/rawData_v1r0/2012-01

/home/badouble/STORE/rawData_v1r0/2012-02

/home/badouble/STORE/rawData_v1r0/2012-03

/home/badouble/STORE/rawData_v1r0/2012-04

/home/badouble/STORE/rawData_v1r0/2012-05

/home/badouble/STORE/rawData_v1r0/2012-06

/home/badouble/STORE/rawData_v1r0/2012-07

/home/badouble/STORE/rawData_v1r0/2012-08

/home/badouble/STORE/rawData_v1r0/2012-09

/home/badouble/STORE/rawData_v1r0/2012-10

/home/badouble/STORE/rawData_v1r0/2012-11

/home/badouble/STORE/rawData_v1r0/2012-12

/home/badouble/STORE/rawData_v1r0/2013-01

/home/badouble/STORE/rawData_v1r0/2013-02

/home/badouble/STORE/rawData_v1r0/2013-03

空白行の代わりに、配列 $ARR の 2 番目の要素を出力する必要があります。

なぜそうしないのですか?

4

3 に答える 3

1

echoこれを行う必要はありませんtr

配列を作成するには、以下に示すようにを使用するだけIFSですread。これらはシェルビルトインコマンドであるため、より効率的です。

IFS=/ read -a ARR <<< "$dir"
echo "${ARR[1]}"
于 2013-03-08T11:16:19.073 に答える
0

echo の出力を次のようにキャプチャする必要があります( )

ARR=( $(echo $dir | tr "/" " ") )

また

 ARR=( `echo $dir | tr "/" " "` )

trまたは、完全に省略します:

ARR=( `echo ${dir//\// }` )

${var//from/to}展開で置換を使用することにより\/、「from」としてエスケープされます。または、さらに良い (より堅牢な) サブプロセスを完全に省略します。

ARR=( ${dir//\/ /} )
于 2013-03-08T11:05:59.840 に答える
0

1 つの余分なブラケット:

ARR=($(echo $dir | tr "/" " "))

x=$(command) これにより、コマンドの結果が変数 x に割り当てられます。

x=($(command))これにより、最初にコマンドが実行され、結果が配列 x に格納されます。

于 2013-03-08T11:08:48.317 に答える