2014-09-30 53 views
3

我是shell腳本編程新手,嘗試編寫檢查參數是否存在以及是否與表達式匹配的功能。我不知道怎麼寫的表達式,所以這是我到目前爲止有:Shell:檢查參數是否存在並匹配表達式

#!/bin/bash 

if [[ -n "$1"] && [${1#*.} -eq "tar.gz"]]; then 
    echo "Passed"; 
else 
    echo "Missing valid argument" 
fi 

要運行腳本,我會鍵入此命令:

# script.sh YYYY-MM.tar.gz 

,我相信我有什麼是

  1. 如果YYYY-MM.tar.gz不script.sh後,會響應「缺少有效的論據」和
  2. 如果文件不結束名爲.tar.gz它Echo的同樣的錯誤。

但是,我想要檢查整個文件名是否是YYYY-MM.tar.gz格式。

回答

4
if [[ -n "$1" ]] && [[ "${1#*.}" == "tar.gz" ]]; then 

-eq:(等於)進行算術測試

==:比較字符串

參見:help test

+0

謝謝!添加第二對[]幫助解決了我的問題。 – Mark 2014-10-01 16:01:57

2

您還可以使用:

case "$1" in 
     *.tar.gz) ;; #passed 
     *) echo "wrong/missing argument $1"; exit 1;; 
esac 
echo "ok arg: $1" 
+0

整潔,更易讀/可維護 – 2014-09-30 19:48:18

0

只要該文件是在正確的YYYY-MM.tar.gz格式,它顯然是非空的,並以.tar.gz結尾。用正則表達式檢查:

if ! [[ $1 =~ [0-9]{4}-[0-9]{1,2}.tar.gz ]]; then 
    echo "Argument 1 not in correct YYYY-MM.tar.gz format" 
    exit 1 
fi 

顯然,上面的正則表達式太籠統了,允許像0193-67.tar.gz這樣的名稱。儘管如此,您可以根據自己的需要調整它,使其儘可能具體。我可能會建議

[1-9][0-9]{3}-([1-9]|10|11|12).tar.gz 

只允許4位年開始,1000(第一個千年ACE支持似乎沒有必要),只有1-12個月(沒有前導零)。

+0

這也有幫助,但我不能兩次投票。 – Mark 2014-10-01 16:00:50

+0

您可以根據自己的喜好多選答案;你只能接受一個你認爲最有幫助的人。 – chepner 2014-10-01 16:38:41

+0

我沒有足夠的積分來upvote:/ – Mark 2014-10-01 18:00:49

相關問題