入力として使用されるbashスクリプトには簡潔で読みやすい関数が必要です。
- 絶対パス(例:/home/user/tmp/data/sample1.txt)
- 新しいファイル名(例:extend_sample.dat)
そして戻ってくる
新しいファイル名を持つ絶対パス(例:/home/user/tmp/data/extended_sample.dat)
よろしくお願いします!
答え1
パス名の操作を簡単にする2+1(追加)コマンドがあります。
- basename - ファイル名からディレクトリとサフィックスを削除します。
dirname - ファイル名から最後の部分を削除します。
readlink - 解決されたシンボリックリンクまたはフルファイル名を印刷します。
したがって、あなたの質問に答えるには:
old_path=/home/user/tmp/data/sample1.txt
new_file=extended_sample.dat
new_path="$(dirname $old_path)/$new_file"
または、ソースファイルのパス名を変更します。
alt_path=/mnt/newroot/foo
new_path="$alt_path/$(basename $old_path)"
実行中のスクリプトの完全な場所を抽出します(スクリプトが独自のファイルで実行されている場合は機能します)。
dirname $(readlink -f ${0})
この3つのコマンドを使用すると、ほとんどのパス操作を簡単に完了できます。
答え2
return
声明に注意してください強く打つ数値をステータスコードとして返すために使用される関数です。
最も単純なケースの外観は次のとおりです。
#!/bin/bash
path="/home/user/tmp/data/sample1.txt"
new_name="extended_sample.dat"
function get_new_path() { echo "${1%/*}/$2"; }
new_path=$(get_new_path "$path" "$new_name")
echo "$new_path"
上記は次のように出力されます。
/home/user/tmp/data/extended_sample.dat
答え3
ちょうどnamerefで遊ぶbash
:
path_replace_file () {
local -n pathvar="$1"
pathvar="${pathvar%/*}/$2"
}
pathname="/home/user/tmp/data/sample1.txt"
printf 'pathname before = %s\n' "$pathname"
path_replace_file pathname extended_sample.dat
printf 'pathname after = %s\n' "$pathname"
出力:
pathname before = /home/user/tmp/data/sample1.txt
pathname after = /home/user/tmp/data/extended_sample.dat
このpath_replace_file
機能には変数名最初のパラメータとして。関数内で、pathvar
その変数のエイリアス(名前を参照)のように動作します。
この関数は、値のファイル名部分を$pathval
関数の2番目の引数として指定された値に置き換えます。
これにはbash
バージョン4.3以降が必要です。
local -n
に変更するとtypeset -n
機能しますksh93
。