bash: [: terlalu banyak argumen?

8

Saya mencoba membuat direktori dan cdmasuk ke dalamnya:

Di ~ / .bashrc:

function abc() {
  appname=$1
  appdir="$HOME/code/$appname"
  if [ mkdir $appdir -a cd $appdir ]; then
    echo Success
  else
    echo Failed to create and switch directory
  fi
}

Ketika saya memuat ulang bashrc ( . ~/.bashrc) saya mendapatkan kesalahan:

bash: [: too many arguments
Failed to create and switch directory

Bagaimana cara saya memperbaikinya? Dan apa artinya [:kesalahan itu?

Ps. Bisakah seseorang mengarahkan saya ke tutorial scripting "non-cryptic" bash?

Zabba
sumber
Ada sesuatu yang salah dalam skrip Anda, saya kira, Anda bisa mulai dengan menggunakan sintaks yang tepat dengan if. if <COMMANDS>; then <COMMANDS>; fi
karthick87
2
Saya tidak tahu apakah ini hanya saya ... tetapi coba Pitfall 6; Saya dengar ada beberapa orang;) mywiki.wooledge.org/BashPitfalls
Alex Stevens

Jawaban:

12

Kesalahan utama dalam skrip Anda adalah bahwa [perintah, setara dengan testperintah, digunakan untuk menguji kondisi, seperti perbandingan string, keberadaan file, dan sebagainya.

Untuk menguji status keluar dari proses yang harus Anda gunakan iftanpa [, jadi skrip Anda bisa

if mkdir "$appdir" && cd "$appdir"; then
  echo "Success"
else
  echo "Failed to create and switch directory"
fi

Ini dijelaskan dalam Bash Pitfalls: 9. if [grep foo myfile .

Saya sarankan Anda membaca GrayCat Bash Guide untuk memahami bash.

enzotib
sumber
Panduan itu sangat bagus! Terima kasih, kalau tidak saya masih akan mengartikan halaman manual :)
Zabba
Cara lain adalah memeriksa apakah dir ada jika [-d ​​"$ APPDIR"]; lalu cd $ APPDIR fi
s1mmel
-3

Sebuah prototipe dapat berupa:

  • Buat file di desktop Anda: touch newDirectory.sh
  • Jadikan file dapat dieksekusi: chmod +x newDirectory.sh
  • Untuk memanggil skrip dari terminal di desktop: ./newDirectory.sh anyName

/

#!/bin/bash
function abc() {
  appname=${1}
  appdir="$HOME/Desktop/$appname"
  if (( mkdir "${appdir}" )) ; then     
    cd "${appdir}"  
    echo "Success" 
  else   
    echo "Failed to create and switch directory" 
  fi
}
abc ${1}

Rekomendasi kecil: jika Anda baru, jangan main-main dengan .bashrc:)

studentz
sumber
2
Maaf tidak. Ada beberapa masalah dengan jawaban itu. 1) hilang a {. 2) tidak pernah berjalan mkdir. 3) Anda tidak menguji cdstatus keluar. 4) Jangan menaruh ekstensi pada skrip. Apalagi .shsaat itu bahkan bukan skrip-sh. 5) Menempatkannya dalam skrip mengalahkan tujuan fungsi. mywiki.wooledge.org/BashGuide
geirha
@geirha: salahku, {sudah ada sebelum pengeditan.
enzotib
Jawaban: ((mkdir "$ {appdir}")) sama dengan 'mkdir "$ {appdir}" '(lihat kutu belakang)
studentz
debug skrip bash -x newDirectory.sh dan Anda akan melihat bahwa skrip akan melakukan cd ke direktori. Jika Anda ingin menjalankan proses lain setelah itu, itu adalah kuda yang sama sekali berbeda.
studentz
Script dijalankan dengan abu dasbor bash. Anda dapat mengubah ekstensi apa pun yang Anda inginkan.
studentz