ユーザーからの入力を受け取り、その詳細を確認しています。
例:
$HOME/Documents/test/one.txt
上記の文字列を入力として取得し、 を取得したい場合はone.txt
、 をさらに進める必要がありますone.txt
。
答え1
@Jordanm はすでに、任意の文字列に適用される標準的な回答を提供しています。パスを具体的に扱う場合は、プログラムbasename
とを使用することもできますdirname
。
basename - strip directory and suffix from filenames
dirname - strip last component from file name
例えば:
$ file="$HOME/Documents/test/one.txt"
$ dir=$(dirname "$file");
$ name=$(basename "$file");
$ echo "The file called $name is in the directory $dir"
The file called one.txt is in the directory /home/terdon/Documents/test
答え2
これは、パラメータ拡張任意の POSIX シェルで。
path=$HOME/Documents/test/one.txt
file=${path##*/} # file contains one.txt
もう 1 つの一般的な方法は、basename プログラムを使用することです。
file=$(basename "$path")
唯一の欠点は、外部プログラムを起動する必要があることです。主な利点は、末尾に . が付いたパスを適切に処理できることです/
。
答え3
ファイル名でこれを行う場合は、次のbasename
コマンドを使用します。
$ basename $HOME/Documents/test/one.txt
one.txt
さらに遠く:
$ FILE=$(basename basename $HOME/Documents/test/one.txt)
$ echo $FILE
one.txt
任意の文字列を任意の区切り文字で分割する必要がある場合、それはちょっとした魔法です。文字列を配列に読み込み、入力フィールドの区切り文字を区切り文字に設定します。
次に例を示します。
$ IFS='/' read -a my_array <<< "$HOME/Documents/test/one.txt"
$ ARRAY_LENGTH=$(( ${#my_array[@]} - 1 ))
$ echo "${my_array[$ARRAY_LENGTH]}"
one.txt