Saya mencoba menulis hook pasca-komitmen untuk SVN, yang di-host di server pengembangan kami. Tujuan saya adalah mencoba untuk secara otomatis checkout salinan dari proyek yang dikomit ke direktori di mana ia di-host di server. Namun saya harus dapat membaca hanya direktori terakhir dalam string direktori yang diteruskan ke skrip untuk checkout ke sub-direktori yang sama di mana proyek kami di-host.
Sebagai contoh jika saya membuat komitmen SVN untuk proyek "contoh", skrip saya mendapat "/ usr / local / svn / repos / example" sebagai argumen pertama. Saya perlu mendapatkan "contoh" dari ujung string dan kemudian menyatukannya dengan string lain sehingga saya dapat checkout ke "/ server / root / example" dan melihat perubahan langsung.
SUBDIR="/path/to/whatever/$(basename $1)"
$1
, atau$1
kosongPendekatan berikut dapat digunakan untuk mendapatkan lintasan apa pun dari lintasan:
Keluaran:
sumber
echo "$(basename "$(dirname "$pathname")")"
Bash bisa mendapatkan bagian terakhir dari jalur tanpa harus memanggil eksternal
basename
:sumber
d=/home/me/somefolder;subdir="/$d/${1##*/}"
Saya akhirnya dengan sesuatu seperti//home/me/somefolder//
$ d sebenarnya berasal dari loopfor d in $(find $SOMEFOLDER -maxdepth 1 -type d);
Menggunakansubdir=$(basename $d)
karya seperti yang diharapkan.while
alih-alihfor
mengulangi output darifind
(find -print0 | xargs -0
lebih baik) atau menggunakan globbing:for d in $SOMEFOLDER/*/
(garis miring terakhir berfungsi seperti-type d
- Anda dapat menggunakan**
di Bash 4 untuk rekursi jika Andashopt -s globstar
, tetapi pesan "Argument list too long" adalah bisa jadi). Perhatikan bahwa${1}
bagian dari perintah mewakili argumen pertama dari skrip atau fungsi. Anda mungkin perlu menggunakan${d##*/}
atau beberapa spesifikasi variabel atau argumen atau memastikan bahwa suatu argumen sedang diajukan$1
$1
mengandungthe path from which last component is to be taken out
. Saya melewatkan bagian itu.target_path='/home/user/dir1/dir2/dir3/'; target_path="${target_path%/}"; last_component=${target_path##*/}; echo $last_component
Kasing penggunaan saya: - Bekerja 😉${1##*/}
berfungsi: unix.stackexchange.com/a/171786/15070