2012-03-15 18 views
122

Tôi đang làm một số kịch bản bash và bây giờ tôi có một cuộc gọi biến source và một mảng gọi samples, như thế này:bash scripting: nếu đối số là tương đương với chuỗi này, định nghĩa một biến như chuỗi này

source='country' 
samples=(US Canada Mexico...) 

vì tôi muốn mở rộng số lượng nguồn (và mỗi nguồn có các mẫu riêng của nó), tôi đã cố gắng thêm một số đối số để làm điều này. Tôi đã thử điều này:

source="" 
samples=("") 
if [ $1="country" ]; then 
    source="country" 
    samples="US Canada Mexico..." 
else 
    echo "try again" 
fi 

nhưng khi tôi chạy tập lệnh source countries.sh country nó không hoạt động. Tôi đang làm gì sai?

+2

nó hoạt động như thế nào? Khi bạn chạy nó, bạn nhận được một lỗi, hoặc nó nói "thử lại", hoặc cái gì khác? –

+2

có, bạn có thể nghĩ 'câu hỏi rất đơn giản'. nhưng bạn đã suy nghĩ về điều này một thời gian. Vui lòng xem xét chỉnh sửa câu hỏi của bạn để bao gồm các kết quả đầu ra bắt buộc và bất kỳ thông báo lỗi nào bạn nhận được. 1 để thực sự thử một cái gì đó và định dạng tốt của câu hỏi. chúc may mắn. – shellter

+0

Tại sao mã này giống với giải pháp được đề xuất và được chấp nhận? Đó là khó hiểu ... Tôi đoán câu hỏi ban đầu không có không gian ngay sau khi mở khung và trước khi đóng khung của câu nếu? – Stef

Trả lời

234

Đừng quên về không gian:

source="" 
samples=("") 
if [ $1 = "country" ]; then 
    source="country" 
    samples="US Canada Mexico..." 
else 
    echo "try again" 
fi 
+65

Tôi không thể tin rằng tôi dành ba giờ trên này, và chỉ là một vấn đề của không gian !!!! ... THANKS @Alex – Alejandro

+1

Tại sao bạn sử dụng 'mẫu =" US Canada Mexico ... "' sau khi giới thiệu mảng tạo trước 'samples = (US Canada Mexico ...)'? –

+1

và thêm == thay vì = – Filippos

4

Thoạt nhìn bạn đang làm một lệnh gán = trong câu lệnh if của bạn thay vì một so sánh == Về cơ bản bạn sẽ cần phải làm:

mysource="" 
samples=("") 


if [ "$1" == "country" ]; then 
    mysource="country" 
    samples="US Canada Mexico..." 
else 
    echo "try again" 
fi 

IE:

~$ source /tmp/foo.sh country 
~$ echo $samples 
US Canada Mexico... 

Là những gì bạn muốn?

+4

Không, bên trong '[]' một đơn '=' là chuỗi so sánh, không gán. –

+0

@hmontoliu: '==' là không cần thiết. Để so sánh các chuỗi bạn sử dụng '='.Thử '[[" A "=" A "]] && echo" bằng "|| echo "khác" " – sgibb

+0

Tuyệt! một điều cần học :-) – hmontoliu

7

Dường như bạn đang tìm cách phân tích đối số dòng lệnh thành tập lệnh bash của bạn. Gần đây tôi đã tự tìm kiếm. Tôi đã xem qua những điều sau đây mà tôi nghĩ sẽ giúp bạn phân tích các đối số:

http://rsalveti.wordpress.com/2007/04/03/bash-parsing-arguments-with-getopts/

tôi đã thêm đoạn dưới đây như là một tl; dr

#using : after a switch variable means it requires some input (ie, t: requires something after t to validate while h requires nothing. 
while getopts “ht:r:p:v” OPTION 
do 
    case $OPTION in 
     h) 
      usage 
      exit 1 
      ;; 
     t) 
      TEST=$OPTARG 
      ;; 
     r) 
      SERVER=$OPTARG 
      ;; 
     p) 
      PASSWD=$OPTARG 
      ;; 
     v) 
      VERBOSE=1 
      ;; 
     ?) 
      usage 
      exit 
      ;; 
    esac 
done 

if [[ -z $TEST ]] || [[ -z $SERVER ]] || [[ -z $PASSWD ]] 
then 
    usage 
    exit 1 
fi 

./script.sh kiểm tra -t máy chủ -r -p password -v

105

Bạn có thể sử dụng toán tử "=" hoặc "==" để so sánh chuỗi trong bash. Yếu tố quan trọng là khoảng cách trong dấu ngoặc đơn. Phương thức thích hợp là cho các dấu ngoặc vuông chứa khoảng cách bên trong và các toán tử chứa khoảng cách xung quanh. Trong một số trường hợp, các kết hợp khác nhau hoạt động; tuy nhiên, sau đây được dự định là một ví dụ phổ quát.

if [ "$1" == "something" ]; then  ## GOOD 

if [ "$1" = "something" ]; then  ## GOOD 

if [ "$1"="something" ]; then  ## BAD (operator spacing) 

if ["$1" == "something"]; then  ## BAD (bracket spacing) 

Ngoài ra, lưu ý dấu ngoặc kép được xử lý hơi khác so với dấu ngoặc đơn ...

if [[ $a == z* ]]; then # True if $a starts with a "z" (pattern matching). 
if [[ $a == "z*" ]]; then # True if $a is equal to z* (literal matching). 

if [ $a == z* ]; then  # File globbing and word splitting take place. 
if [ "$a" == "z*" ]; then # True if $a is equal to z* (literal matching). 

Tôi hy vọng rằng sẽ giúp!