Saya punya function
di .bashrc
file saya . Saya tahu apa fungsinya, ia meningkatkan X banyak direktoricd
Ini dia:
up()
{
local d=""
limit=$1
for ((i=1 ; i <= limit ; i++))
do
d=$d/..
done
d=$(echo $d | sed 's/^\///')
if [ -z "$d" ]; then
d=..
fi
cd $d
}
Tetapi bisakah Anda menjelaskan tiga hal ini untuk saya?
d=$d/..
sed 's/^\///'
d=..
Mengapa tidak melakukan seperti ini:
up()
{
limit=$1
for ((i=1 ; i <= limit ; i++))
do
cd ..
done
}
Pemakaian:
<<<>>>~$ up 3
<<<>>>/$
$OLDPWD
diinjak-injak datang ke pikiran. Dan pada zsh dengancd
set untuk menggunakan dirstack, itu juga.$1
untuklimit
bukan hanya menggunakan$1
dalam lingkaran?${1:-1}
sebagai gantinya, seperti pada varian glenn.d = $ d / ..
Ini menggabungkan isi var
d
dengan/..
dan memberikannya kembalid
.Hasil akhirnya adalah membuat
d
string yang berulang seperti/../../../..
.sed 's / ^ ///'
Hapus pemimpin
/
dari string yang disediakan,d
(echo $ d) dalam kode yang Anda posting.Mungkin ditulis lebih baik
sed 's|^/||'
untuk menghindari backslash.Alternatif (lebih cepat dan lebih sederhana) adalah menulis
d=${d#/}
.d = ..
Tetapkan string
..
ke vard
.Ini hanya masuk akal sebagai cara untuk memastikan bahwa
d
setidaknya ada satu..
dalam kasus tesif [ -z "$d" ]; then
menandakan bahwa vard
kosong. Dan itu hanya dapat terjadi karena perintah sed menghapus satu karakter darid
.Jika tidak perlu menghapus karakter dari d, tidak perlu
sed
atauif
.Kode dalam pertanyaan Anda akan selalu naik setidaknya satu dir.
Lebih baik
local d
sudah cukup untuk memastikan bahwa variabel kosong, tidak ada lagi yang diperlukan.Namun, lokal hanya berfungsi di beberapa shell seperti bash atau dash. Secara khusus,
ksh
(asyash
) tidak memilikilocal
perintah. Solusi yang lebih portabel adalah:The
for((
sintaks tidak portabel. Lebih baik gunakan sesuatu seperti:Kuat.
Jika nilai yang diberikan ke argumen fungsi pertama bisa negatif atau teks, fungsi harus kuat untuk memproses nilai-nilai tersebut.
Pertama, mari kita batasi nilai hanya untuk angka (saya akan gunakan
c
untukcount
):Dan kemudian batasi nilai hitungan hanya untuk nilai positif:
Fungsi ini akan dengan senang hati menerima 0 atau teks apa pun (tanpa kesalahan):
Hapus
echo \
ketika Anda telah menguji fungsi.sumber