2017-02-03 6 views
1

У меня есть сценарий, когда вы выбираете настольный файл, но когда я запускаю этот случай функции:Сценарий Shell: Дело вопрос

File=$(yad --file); 

if [[ "$File" =~ *".desktop" ]]; then 
echo "yes" 
else 
echo "no" 
if 

и я стараюсь это:

File=$(yad --file); 
case $File in 
    *.desktop) 
    echo "yes" 
    ;; 
    *) 
    echo "no" 
    ;; 
esac 

он всегда говорит мне что я должен повторить попытку, я не знаю, в чем проблема, может ли кто-нибудь мне помочь?

+2

Пуск, вставив это в http://www.shellcheck.net/ и исправить все ошибки, он показывает вам. Я вижу, как минимум три синтаксических ошибки. –

+0

'if/then' не является статусом' case'. Но вы можете использовать оператор case: 'case $ File in * .desktop) echo yes ;; *) echo no ;; esac; ' –

+0

Я уже пытаюсь, но та же проблема говорит мне попробовать еще раз –

ответ

2

Я не совсем уверен, что этот сценарий должен делать, но попробуйте это:

File="$(Yad --file)" 

if [[ "$File" =~ .*[.]desktop$ ]]; then 
echo "yes" 
else 
echo "no" 
fi 

Bash соответствие регулярных выражения (=~) использует расширенные регулярные выражения, а не выражение шарика. Чтобы обозначить любую последовательность из нуля или более символов, вам необходимо использовать .*. . означает «любой символ», а * означает ноль или более раз. [.] обозначает буквальный период, избегая значения «любого символа» ., используемого отдельно. Я также добавил анкер конца строки ($). Это заставляет шаблон соответствовать концу имени файла, как вы, вероятно, захотите, если вы согласуетесь с расширением.

В вашей первой строке также есть ошибка. Между значком и круглыми скобками $ не должно быть пробелов. Чтобы закрыть блок if, вам необходимо использовать fi.

Вы можете использовать сопоставление Glob стиле с Баш условными, просто использовать знак равенства:

if [[ "$File" = *.desktop ]]; then 
+0

Нет необходимости в двойных кавычках вокруг переменных внутри' [[]] '. – codeforester

+4

@codeforester Я знаю, но это тоже не повредит (помимо, как минимум, шаблонов регулярных выражений), и я так привык к цитированию к настоящему времени ... Для многих людей, цитируя везде, возможно, легче запомнить и безопаснее, чем пытаться помните, что нужно указывать, а что нет. – Fred

+0

им жаль этот скрипт не работал так хорошо './test.sh: 3: ./test.sh: [[: не найдены no' –