Баш: [: слишком много аргументов?


8

Я пытаюсь создать каталог и cdв него:

В ~ / .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
}

Когда я перезагружаю bashrc ( . ~/.bashrc), я получаю ошибку:

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

Как я могу это исправить? А что [:в ошибке значит?

Ps. Может ли кто-нибудь направить меня к «не зашифрованному» учебнику по написанию сценариев bash?


В вашем скрипте что-то не так, я думаю, вы можете начать с использования правильного синтаксиса с if. if <COMMANDS>; then <COMMANDS>; fi
karthick87

2
Я не знаю, только ли это я ... но попробуйте Pitfall 6; Я слышал, что это получает несколько человек;) mywiki.wooledge.org/BashPitfalls
Алекс Стивенс

Ответы:


12

Основная ошибка в вашем скрипте состоит в том, что [команда, эквивалентная testкоманде, используется для проверки условий, таких как сравнение строк, существование файлов и так далее.

Чтобы проверить состояние выхода процессов, которые вы должны использовать ifбез [, чтобы ваш сценарий мог быть

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

Это объясняется в Bash Pitfalls: 9. if [grep foo myfile .

Я предлагаю вам пройтись по GrayCat Bash Guide, чтобы понять bash.


Это руководство действительно очень хорошо! Спасибо, иначе я бы все еще расшифровал man-страницы :)
Zabba

Другой способ - проверить, существует ли каталог, если [-d "$ APPDIR"]; тогда cd $ APPDIR fi
s1mmel

-3

Прототип может быть:

  • Создайте файл на рабочем столе: touch newDirectory.sh
  • Сделать файл исполняемым: chmod +x newDirectory.sh
  • Чтобы вызвать скрипт из терминала на рабочем столе: ./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}

Маленькая рекомендация: если вы новичок, не связывайтесь с .bashrc:)


2
Извини, нет. Есть несколько проблем с этим ответом. 1) отсутствует {. 2) это никогда не работает mkdir. 3) вы не проверяли cdстатус выхода. 4) Не ставьте расширения на скрипты. Особенно, .shкогда это даже не сценарий. 5) Помещение в скрипт отрицает назначение функции. mywiki.wooledge.org/BashGuide
гейра

@geirha: по моей вине, это {было до моего редактирования.
энзотиб

Ответ: ((mkdir "$ {appdir}")) равно 'mkdir "$ {appdir}" '(посмотрите на
галочки

отладьте скрипт bash -x newDirectory.sh, и вы увидите, что скрипт перейдет в каталог. Если после этого вы захотите запустить другой процесс, это совершенно другая лошадь.
studentz

Скрипт работает с Bash Dash Ash. Вы можете изменить расширение как хотите.
studentz
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.