问个小问题,shell如何输出最后一个参数
#!/usr/bin/ksh
cal_id=1
num_count=10
max_num=-99999
min_num=-99999
while [ $cal_id -le $num_count ]
do
read line
if [ $cal_id -eq 1 ] ; then
min_num=$line
fi
if [ $line -ge $max_num ] ; then
max_num=$line
fi
if [ $line -le $min_num ] ; then
min_num=$line
fi
cal_id=`expr $cal_id 1`
done
clear
echo $max_num
echo $min_num
基本上没有问题了
shell脚本取重复数据的最后一条记录
假设你这个.unl文件叫 file.unl,并且内容不含斜杠 / 。
脚本大致如下:
#!/bin/bash
myfile=file.unl
touch tmp
while read line
do
grep "$line" tmp /dev/null 21
if [ $? -eq 0 ]; then
num=`awk '{print $nf}' tmp`
num=`expr $num 1`
sed -i “s/^($linet)[0-9]*$/1$num/” tmp
else
echo -e "$linet1" tmp
fi
done $myfile # --- 1), 2)
awk '$nf1{print}' tmp err.unl # --- 3)
sed -i 's/^(..*)t[0-9]*$/1/' tmp
mv -f tmp $myfile # --- 4)
exit 0
思路就是,
1)遍历 unl 文件的每一行,逐行拷贝一份到临时文件tmp中,后面附加一个出现的次数。
2)遍历的同时到tmp文件中去查找是否有已存在的相同记录,如果有,就只是更新tmp文件中记录的次数而不添加一个新记录。
3)最后根据tmp文件中记录的次数是否大于1来生成err.unl文件,记录重复的行及总共出现的次数。
4)将tmp文件中的次数记录去除即得到更新后的 unl 文件。
由于要求要覆盖原unl文件,所以这里存在风险。 建议运行脚本前先备份一下原unl文件。
最后,恕我直言,这个题目的难度不止10分。
你看,while循环,grep / sed / awk,全用上了 ^_^
————————————————————————————————————
发现一个更简练的方法,两条命令即可搞定:
awk '{s[$0] =1} end{for(a in s) print a, s[a]}' file.unl err.unl
awk '{print $1}' err.unl file.unl
当然,前提是unl文件的每行内容不能含有空格或tab之类的分隔符。
参考了 这个问题中shuguangbo童鞋的回答。
如何获取传入给shell脚本的最后一个参数
执行“nano test.sh”创建一个新的shell脚本。
脚本test.sh的内容如下:
#!/bin/sh
name=$1
echo "the ${name} are great man!"
给新创建的test.sh的脚本赋可执行权限,命令为“chmod 755 test.sh”。
执行'./test.sh "xiao wang"'命令,可以看到自己编写脚本的结果“the xiao wang are great man!”。
5
"name=$1"中$1为系统提供的位置参数,$0代表程序的名称,[$1/$2/...]从1开始为传递的参数。
6
linux系统除了提供位置参数还提供内置参数,内置参数如下:
$# ----传递给程序的总的参数数目
$? ----上一个代码或者shell程序在shell中退出的情况,如果正常退出则返回0,反之为非0值。
$* ----传递给程序的所有参数组成的字符串。
$n ----表示第几个参数,$1 表示第一个参数,$2 表示第二个参数 ... $0 ----当前程序的名称
$@----以"参数1" "参数2" ... 形式保存所有参数
$$ ----本程序的(进程id号)pid
$! ----上一个命令的pid