Truyền đối số dòng lệnh cho tập lệnh bash


114

Tôi mới tham gia lập trình bash script.

Tôi muốn triển khai tập lệnh bash 'deploymLog', chấp nhận làm đầu vào một đối số chuỗi (tên).

[root@localhost Desktop]# ./deploymLog.sh name

Ở đây tôi muốn truyền đối số chuỗi (tên) thông qua dòng lệnh

Là bước đầu tiên, tôi cần nối thêm dấu thời gian hiện tại cùng với chuỗi đầu vào này vào tệp nhật ký Logone.txttrong thư mục hiện tại theo định dạng dưới đây:

[name]=[System time timestamp1]

Làm thế nào là nó có thể?

Câu trả lời:


112
$> cat ./deploymLog.sh 
#!/bin/bash

name=$1
log_file="Logone.txt"

if [[ -n "$name" ]]; then
    echo "$1=$( date +%s )" >> ${log_file}
else
    echo "argument error"
fi

Đối số đầu tiên từ một dòng lệnh có thể được tìm thấy với tham số vị trí $1. [[ -n "$name" ]]kiểm tra để xem nếu $namekhông trống. date +%strả về dấu thời gian hiện tại trong thời gian Unix. Các >>nhà điều hành được sử dụng để ghi vào một tập tin bằng cách thêm vào các dữ liệu hiện có trong file.

$> ./deploymLog.sh tt

$> cat Logone.txt 
tt=1329810941

$> ./deploymLog.sh rr

$> cat Logone.txt 
tt=1329810941
rr=1329810953

Để có dấu thời gian dễ đọc hơn, bạn có thể chơi với các dateđối số.


7
tổng số người mới bắt đầu ở đây ... sẽ rất hữu ích khi biết [[ -n "$name" ]]phần đó đang làm gì.
MichaelChirico

Phải, đó là sự thật Tôi cũng là một người hoàn toàn và kịch bản của tôi sắp chết trên dòng đó ???
pythonia29033

4
"[[-N" $ name "]]" là một dạng khác của lệnh "test". Xem: ss64.com/bash/test.html
jewettg

64

Các đối số dòng lệnh Shell có thể truy cập thông qua $1(đầu tiên), $n(thứ n) hoặc $*(tất cả các đối số), vì vậy tập lệnh của bạn sẽ bắt đầu:

#!/bin/bash

if [ $# -ne 1 ]; then
    echo $0: usage: myscript name
    exit 1
fi

name=$1

Bây giờ đối số tên có thể truy cập từ tập lệnh như $name.

Để lấy dấu thời gian, hãy sử dụng date(1)lệnh và cung cấp cho nó một trình xác định định dạng để nó tạo ra định dạng bạn muốn:

now=$(date +%Y%m%d%H%M%S)

Bây giờ $nowchứa ngày và thời gian hiện tại.

Vì vậy, bạn có thể tạo tệp nhật ký của mình như vậy:

logfile=/path/to/log/file/mylogfile.$now
echo "[$name]=[$now]" >> $logfile

Bạn nên sử dụng chức năng shell để ghi nhật ký tin nhắn của mình vì nó sẽ dễ sử dụng hơn:

function logit
{
    now=$(date +%Y%m%d%H%M%S)
    echo "$now: $*" >> $logfile
}

Lưu ý rằng các hàm shell truy cập các đối số của riêng chúng giống như tập lệnh (thông qua $1v.v.)

Vì vậy, kịch bản ban đầu trông như thế này:

#!/bin/bash

function logit
{
    now=$(date +%Y%m%d%H%M%S)
    echo "$now: $*" >> $logfile
}

if [ $# -ne 1 ]; then
    echo $0: usage: myscript name
    exit 1
fi

name=$1
now=$(date +%Y%m%d%H%M%S)
logfile=/path/to/log/file/mylogfile.$now

logit name = $name

(lưu ý tệp nhật ký không ở định dạng chính xác mà bạn đã chỉ định; nó ở dạng tốt hơn với dấu thời gian ở đầu mỗi dòng).


7
#!/bin/bash

name=$1

echo "$(date '+%Y%m%d-%H:%M:%S') => " $name >> x.log

chạy "bash deploymLog.sh bất cứ điều gì" và bạn đã có x.log với

20120220-23:53:50 =>  whatever

Khi bạn bỏ phiếu xuống, đưa ra một lý do, cảm ơn.

Tôi cho rằng downvoter đã bỏ lỡ lý do name=$1. Biến $ name không bao giờ được sử dụng, vì bạn chỉ xuất ra chuỗi 'name' theo nghĩa đen.
manatwork

Ôi lỗi của tôi. cảm ơn đã chỉ ra tôi cần phải cẩn thận hơn
Dyno Fu

@DynoHongjunFu Tuy nhiên, biến có cùng tên và giá trị, đây không phải là cách hay để làm cho ví dụ có thể đọc được.
Volker Siegel

Tốt nhất là trích dẫn var khi gán tên như thế này:name="$1"
Jake
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.