Tôi muốn tập lệnh của mình có thể nhận đầu vào tùy chọn,
ví dụ hiện tại kịch bản của tôi là
#!/bin/bash
somecommand foo
nhưng tôi muốn nói:
#!/bin/bash
somecommand [ if $1 exists, $1, else, foo ]
Tôi muốn tập lệnh của mình có thể nhận đầu vào tùy chọn,
ví dụ hiện tại kịch bản của tôi là
#!/bin/bash
somecommand foo
nhưng tôi muốn nói:
#!/bin/bash
somecommand [ if $1 exists, $1, else, foo ]
Câu trả lời:
Bạn có thể sử dụng cú pháp giá trị mặc định:
somecommand ${1:-foo}
Ý chí trên, như được mô tả trong Hướng dẫn tham khảo Bash - Mở rộng tham số Shell 3.5.3 [khai thác mỏ nhấn mạnh]:
Nếu tham số không được đặt hoặc null , việc mở rộng từ được thay thế. Mặt khác, giá trị của tham số được thay thế.
Nếu bạn chỉ muốn thay thế một giá trị mặc định nếu tham số không được đặt (nhưng không phải nếu nó là null, ví dụ không phải nếu đó là một chuỗi rỗng), thay vào đó hãy sử dụng cú pháp này:
somecommand ${1-foo}
Một lần nữa từ Hướng dẫn tham khảo Bash - Mở rộng tham số Shell 3.5.3 :
Bỏ qua các kết quả dấu hai chấm trong một thử nghiệm chỉ cho một tham số không được đặt. Nói cách khác, nếu bao gồm dấu hai chấm, toán tử kiểm tra sự tồn tại của cả tham số và giá trị của nó không phải là null; nếu dấu hai chấm bị bỏ qua, toán tử chỉ kiểm tra sự tồn tại.
foo
if $1
unset hoặc chuỗi rỗng " và ${1-foo}
"return foo
if $1
unset".
Bạn có thể đặt giá trị mặc định cho một biến như vậy:
#!/usr/bin/env bash
ARG1=${1:-foo}
ARG2=${2:-bar}
ARG3=${3:-1}
ARG4=${4:-$(date)}
echo "$ARG1"
echo "$ARG2"
echo "$ARG3"
echo "$ARG4"
Dưới đây là một số ví dụ về cách thức hoạt động của nó:
$ ./somecommand.sh
foo
bar
1
Thu Mar 29 10:03:20 ADT 2018
$ ./somecommand.sh ez
ez
bar
1
Thu Mar 29 10:03:40 ADT 2018
$ ./somecommand.sh able was i
able
was
i
Thu Mar 29 10:03:54 ADT 2018
$ ./somecommand.sh "able was i"
able was i
bar
1
Thu Mar 29 10:04:01 ADT 2018
$ ./somecommand.sh "able was i" super
able was i
super
1
Thu Mar 29 10:04:10 ADT 2018
$ ./somecommand.sh "" "super duper"
foo
super duper
1
Thu Mar 29 10:05:04 ADT 2018
$ ./somecommand.sh "" "super duper" hi you
foo
super duper
hi
you
-
bối rối (có bị phủ nhận không?).
if [ ! -z $1 ]
then
: # $1 was given
else
: # $1 was not given
fi
-n
cũng giống như ! -z
.
-n
và ! -z
vì vậy tôi sẽ nói rằng đó không phải là trường hợp ở đây.
[ -n $1 ]
sẽ luôn luôn đúng . Nếu bạn sử dụng bash, [[ -n $1 ]]
sẽ hành xử như bạn mong đợi, nếu không bạn phải trích dẫn[ -n "$1" ]
xin đừng quên, nếu biến của nó $ 1 .. $ n bạn cần ghi vào một biến thông thường để sử dụng thay thế
#!/bin/bash
NOW=$1
echo ${NOW:-$(date +"%Y-%m-%d")}
DAY=${1:-$(date +%F -d "yesterday")}
Đối với nhiều đối số tùy chọn , bằng cách tương tự với ls
lệnh có thể lấy một hoặc nhiều tệp hoặc theo mặc định liệt kê mọi thứ trong thư mục hiện tại:
if [ $# -ge 1 ]
then
files="$@"
else
files=*
fi
for f in $files
do
echo "found $f"
done
Không hoạt động chính xác cho các tệp có khoảng trắng trong đường dẫn, than ôi. Chưa tìm ra cách để làm cho công việc đó được nêu ra.
Có thể sử dụng thay thế biến để thay thế một giá trị cố định hoặc một lệnh (như date
) cho một đối số. Các câu trả lời cho đến nay đã tập trung vào các giá trị cố định, nhưng đây là những gì tôi đã sử dụng để biến ngày thành một đối số tùy chọn:
~$ sh co.sh
2017-01-05
~$ sh co.sh 2017-01-04
2017-01-04
~$ cat co.sh
DAY=${1:-$(date +%F -d "yesterday")}
echo $DAY