2016-08-15 3 views
1

IFSを使用して文字列を分割しようとしていますが、多くの場所で提供されている例を見ています。bashの文字列を分割する際に配列の添え字が正しくない

path_to_file="/home/user/path/to/fileName.txt"; 
    IFS='/' read -ra split_path <<< "$path_to_file"; 
    file_name="${split_path[-1]}"; 

これは、アレイ内の単一の要素にスペースで区切って文字列全体を与える:私は、分割後の配列の最後の要素を取得したい、私は目標を達成するために、次のやっています。最後のコマンドを実行すると、 "-bash:split_path:bad array subscript"というエラーメッセージが表示されます。私が間違ってやっていることは、配列の別のインデックスに分けられた要素を私に与えていないことです。

答えて

4

バッシュ3.xは、配列の最後の要素を意味する-1を理解しません。あなたが望む

echo "${split_path[${#split_path[@]}-1]}" 

引用符にも注意してください。

他の人が指摘したように、basenameはあなたのお金のためのより良い実行される可能性がある、またはファイル名を含む${path_to_file##*/}

+1

'$ {パス_to_file ## * /}' '-1'はより新しいbash版では動作します。 (それは4.3.11の私のために働く) – PSkocik

+0

@PSkocik訂正していただきありがとうございます。ええ、これはバッシュ3です。私は、OPが苦労していると思います。 – tripleee

+0

私のBashバージョンは4.1.2ですが。あなたの答えは私が探しているものです。 – Prometheus

1

ベース名;

path_to_file="/home/user/path/to/fileName.txt"; 
file_name=$(basename "$path_to_file") 
echo $file_name 

とawk;

path_to_file="/home/user/path/to/fileName.txt"; 
file_name=$(echo $path_to_file | awk -F/'{print $NF}') 
echo $file_name 

またはwhileループ。

path_to_file="/home/user/path/to/fileName.txt"; 
while IFS='/' read -ra split_path ; do 
file_name="${split_path[-1]}"; 
echo $file_name 
done <<<$path_to_file 
+0

変数は、常に二重引用符で囲む必要があります。 – tripleee

関連する問題