我在使用 getopts 和简单的 bash 参数时遇到问题。我的脚本从与指定表达式匹配的文件行中写出。
-f 选项允许您更改文件
-n 选项更改写出的行数
第一个参数 $1 决定表达式的类型
示例文件(file.txt):
aaaaaaaaaaaa
bbbbbbbbbbba
cccccccccccc
ab
ac
dddddddddddd
dgdgdgdgdgdg
abdbdbdbdbdb
Run Code Online (Sandbox Code Playgroud)
示例订单:
./script.sh a -f file.txt -n 2
Run Code Online (Sandbox Code Playgroud)
示例输出:
aaaaaaaaaaaa
ab
Run Code Online (Sandbox Code Playgroud)
我的脚本:
while getopts ":n:f:" opt
do
case $opt in
(n)
argn=$OPTARG
;;
(f)
argf=$OPTARG
;;
esac
done
FOO=${argf:=/etc/passwd}
NR=${argn:=3}
echo " --------- ^$1 -----------"
awk -F':' '/^'"$1"'/ { print $1 }' $FOO | head -n $NR
Run Code Online (Sandbox Code Playgroud)
它仅适用于例如当我输入时
./script.sh a
Run Code Online (Sandbox Code Playgroud)
或者
./script.sh b
Run Code Online (Sandbox Code Playgroud)
(给我以这封信开头的行)。或者当我刚刚打字时
./script.sh -n 5
Run Code Online (Sandbox Code Playgroud)
或者
./script -f …Run Code Online (Sandbox Code Playgroud) 我有一个表3列:name,lastname和date.
例如:
Name Lastname Date
Ab Ab 2008-07-01
Ab Ab 2006-06-23
Kb Kb 2008-07-01
Kb Kb 2007-06-03
Run Code Online (Sandbox Code Playgroud)
我需要找到那些谁被分配到的名称2008-07,而不是2006-06.因此,对于此示例,输出将为:
Name Lastname Date
Kb Kb 2008-07-01
Kb Kb 2007-06-03
Run Code Online (Sandbox Code Playgroud)
我的代码:
select Name, Lastname, YEAR(date), MONTH(date) from MyTable
where (YEAR(date) = 2008 AND MONTH(date) = 7) AND (YEAR(date) <> 2006 AND MONTH(date) <> 6)
Run Code Online (Sandbox Code Playgroud)
它不能很好地工作,因为没有任何事情发生(它"阻塞"例如所有名称与月份= 6).我尝试用UNION语句来做,但没有什么效果.
注意,我需要在不使用子查询的情况下执行此操作.