Bash определяет, были ли установлены переменные параметра ($ 1, $ 2, $ 3 и т. Д.)

1

Многие из постов, которые я только что прочитал, имеют много ответов, которые охватывают это, но я не понимаю, что я делаю на самом деле; это было хитом и мисс.

Скрипт .sh, с которым я работаю:

#!/bin/bash  
# init  

input=$1  
output=$(ping -c 1 "$input" 2>/dev/null)                
if [ $? -eq 0 ]; then                  
   ip=$(printf '%s' "$output" | gawk -F'[()]' '/PING/{print $2}'  2>/dev/null)     
   echo "$ip";                
   sleep 2              
else         
   echo "Host not found";      
fi         

Многие из постов, которые я только что прочитал, охватывают это и утверждают, что есть несколько различных методов, которые могут быть использованы для достижения этой цели, но я до сих пор не понимаю, как правильно их использовать. По сути, я пытаюсь проверить, была ли переменная "$ 1" установлена ​​аргументом, и показать что-то вроде:

echo No argument given  

если переменная пуста, вместо того, чтобы просто пропинговать хост. Мой вопрос: как мне это делать, не усложняя вещи?

Помощь всегда приветствуется, спасибо заранее.

PS: я все еще довольно новичок в среде Linux, так что будьте спокойны со мной.

Jugy
источник
1
Добро пожаловать в Супер пользователя! Нет необходимости добавлять «Решено» в заголовок вашего сообщения. Решенные вопросы автоматически форматируются по-разному на первой странице.
Excellll

Ответы:

1

Я бы добавил чек в начале. В случае сбоя выведите сообщение и выйдите.

#!/bin/bash  
# init  

if [ -z "$1" ]; then
  echo No argument given 
  exit
fi

input=$1  
output=$(ping -c 1 "$input" 2>/dev/null)                
if [ $? -eq 0 ]; then                  
   ip=$(printf '%s' "$output" | gawk -F'[()]' '/PING/{print $2}'  2>/dev/null)     
   echo "$ip";                
   sleep 2              
else         
   echo "Host not found";      
fi        
LatinSuD
источник
2
Это, вероятно, не имеет значения в этом случае, но иногда вам нужно уметь различать не заданный параметр ( ScriptFile) и параметр, явно заданный для пустой строки ( ScriptFile "" Param2 ...): в этом случае вам нужно использовать $ # , как предлагает @Torre
AFH
1

Если вы хотите узнать количество переданных аргументов, используйте $ #. Нравится:

if [ $# -eq 0 ]; then
  echo "No argument given"
fi

Надеюсь, это поможет.

JP de la Torre
источник