Berapa nilai $ {# 1}?

9

Tolong jelaskan penggunaan di ${#1}bawah ini:

getlable ()     
{
    if (( ${#1} == 0 )); then test="-"; else test="${1}"; fi;
}
Prasad
sumber
1
Hanya ingin tahu: apakah Anda repot-repot meletakkan echo ${#1}sebelum pernyataan itu untuk melihat nilainya? Jika demikian, Anda umumnya harus memasukkan apa yang Anda temukan dalam penelitian itu dalam pertanyaan, dan mungkin penjelasan mengapa itu tidak membantu.
jpmc26

Jawaban:

24

${#1}adalah panjang (dalam jumlah karakter) $1yang merupakan argumen pertama ke fungsi.

Jadi (( ${#1} == 0 ))adalah cara berbelit-belit untuk menguji apakah argumen pertama kosong (atau tidak disetel, parameter tidak disetel tampak kosong ketika diperluas) atau tidak.

Untuk menguji parameter kosong, cara kanonik adalah:

[ -z "$1" ]

Tetapi di sana, lebih mungkin maksudnya adalah untuk memeriksa apakah argumen disediakan untuk fungsi dalam hal ini sintaksinya adalah:

[ "$#" -eq 0 ]

(atau (($# == 0))jika Anda ingin membuat skrip Anda khusus ksh / bash / zsh).

Namun dalam kedua kasus, cangkang Bourne-like memiliki jalan pintas untuk itu:

test=${1:--} # set test to $1, or "-" if $1 is empty or not provided
test=${1--}  # set test to $1, or "-" if $1 is not provided

Sekarang, jika maksudnya adalah meneruskannya ke catatau utilitas teks lain sehingga -(yang berarti stdin) diteruskan ketika tidak ada argumen yang diberikan, maka Anda mungkin tidak memerlukan semua itu sama sekali.

Dari pada:

getlable() {
  test=${1--}
  cat -- "$test"
}

Kerjakan saja:

getlable() {
  cat -- "$@"
}

Daftar argumen ke fungsi akan diteruskan apa adanya ke cat. Jika tidak ada argumen, tidak catakan menerima argumen (dan kemudian membaca dari stdin seolah-olah itu -argumen tunggal ). Dan jika ada satu atau lebih argumen mereka semua akan lulus apa adanya cat.

Stéphane Chazelas
sumber
Nah
4

${#1} adalah panjang dari parameter posisi pertama.

Dalam shell yang berjalan Anda dapat menggunakan

set -- foo bar
echo ${#1}
3

untuk mengaturnya.

Hauke ​​Laging
sumber