⑴ 怎么通过shell脚本让系统对一个文件进行自动修改
1
自动检测
可以将脚本放在cretab中定时运行
2
如何确定文件被修改
1
采用stat命令
将这个文件的最初状态保存到一个文件中
resource.txt
源文件
2
每次运行脚本时,也用stat命令查看文件状态,保存到
result.txt中
3
将resource.txt和result.txt2个文件进行对比
diff命令。如果有不同即表明文件被修改。
⑵ linux中设计一个shell脚本程序可以接受命令行输入的参数执行相应的菜单命令
之所以用到命令行参数,关键在于shell脚本需要与运行脚本的人员进行交互。
bash shell提供了命令行参数添加在命令后面的数据值)、命令行选项修改命令行为的单字符值)和直接读取键盘输入。
1、命令行参数
向shell脚本传递数据的最基本方式是使用命令行参数。
1)读取参数
读取输入的参数的变量为位置参数,位置参数通过标准数字表示,
其中$0为程序名称,$1为第一个参数,$2为第二个参数,依次类推,直到$9为第九个参数。
shell脚本自动将命令行参数赋值给各个位置变量。
同时输入多个参数可以是数值也可以是字符串)时,必须使用空格分隔要想在参数值中包含空格,就必须使用单引号或双引号)
当参数多于9个后,必须在shell脚本内使用大括号将变量括起来,如${10}。从而可以使用任意个参数。
2)读取程序名称
传递给变量$0的字符串实际上是程序的路径根据调用方法决定是相对还是绝对路径)。
使用basename命令可以去掉路径前缀,只获得程序名称名字中不 可以有空格)。
3)测试脚本
当脚本认为应该包含参数,却实际上没有数据时,就会出错。
好的方法是对参数进行检查来保证使用参数前确实存在数据,可以使用-n参数来检查。
例子:if [ –n “$1” ] then .. else .. fi
2、特殊的参数变量
用于跟踪命令行参数
1)参数计数
使用特殊变量$#测试执行脚本时包含的命令行参数个数。脚本中任何位置都可以 使用$#
例子:if [ $# –ne 2 ] 即可测试参数个数
可以使用${!#}来返回最后一个命令行参数当无参数时,$#为0,而${!#}为程序名)
2)获取所有数据
变量$*将命令行中提供的所有参数作为一个单词处理,它将多个参数看成 一个参数。
变量$@将命令行中提供的所有参数作为同一个字符串中的多个单词处理。 允许对其中的值进行迭代一般使用for),分隔开不同参数
3、移位
shift命令能够改变命令行参数的相对位置。默 认将每个参数变量左移一个位置变量$0不变,把$1丢弃,注意不可以恢复了!)
在不清楚参数数目情况下,这是一个迭代参数的好办法。
可以为shift提供一个参数,来实现多位移变化。
4、处理选项
选项是由破折号引导的单个字母,用于更改命令的行为。
1,找出选项
1)处理简单选项
可以使用处理命令行参数相同的方法处理选项,抽取时使用case语句进行判断是否符合选项格式。
2)从参数中分离选项
同时使用选项和参数时,可以使用--指示选项列表的结束。发现--后,shell就知道后面的是普通参数了,停止使用case处理选项。
3)处理带值的选项
选项后紧跟参数值,一种方法是在case中对应选项后使用shift和读后一位参数的方法处理。更好的方法如 下:
2,使用getopt命令
getopt命令在处理选项和参数时非常方便。它对参数进行重新组 织,以便于解析
1)命令格式
getopt可以接受任意形式的选项和参数列表,并自动将它们转换为适当的格式。
命令格式为: getopt options optstring parameters
选项字符串(opstring)用于定义命令行中的有效选项字母,以及哪些选项字母需要参数值。
2)脚本中使用getopt
需要使用set命令将现有的命令行选项和参数替换为getopt命令生成的 格式化形式。
需要将原始脚本命令行参数送给getopt命令,然后将getopt命令输出送给set命令,如下:set – `getopts –q ab:cd “$@”`
但是getopt命令不能很好的处理带有空格的参数值,它将空格解析为参数分隔符,而不是将双引号引起来的两个 值合并成一个参数。解决办法如下:
3)更高级的getopts命令
getopts命令顺序的对现有的shell参数变量进行处理,每调用一次,只处理命令中检测到的参数中的一个。处理完所有参数后,以大于0的退出 状态退出。
非常适宜于在循环中解析所有命令行参数
格式为: getopts optstring variable
$optarg包含需要参数值的选项要使用的值,$optind包含getopts停止处理时在参数列表中的位置。
注意:当getopts处理时,会将选项前的-去掉,所以对应的case中不需要破折号。
好的特性:
1)可以在参数值中包含空格
2)选项字母和参数值中间可以没有空格
3)将在命令行中找到的未定义的选项都绑定为单一的输出——问号
5、标准化选项
有一些字母选项具有标准含义。最好按照标准含义定义选项意义
-a –c –d –e –f –h –i –l –n –o –q –r –s –v- x –y
6、获取用户输入
当需要在执行过程中获得执行脚本人员的输入,使用read命令
1)基本读取
read命令接受标准输入或其他文件描述符输入。读入后将数据放入 一个标准变量中。
-p 允许在read命令行中直接指定一个提示。
可以指定多个变量,也可以不指定将放置在reply环境变量中)
2)计时
使用-t指定一个计时器,计时数满还未输入,read返回一个非0的退出状态。
使用-n指定输入的字符个数,输入达到预定数目时,就自动结束输入
3)默读
使用-s使输入不显示在终端例如输入密码)
4)读取文件
最常用的方法是使用cat命令,并通过管道传给包含read的while语句。
⑶ 在编写shell脚本时,用什么命令来修改配置文件,求解。越详细越好,谢啦!
完全脚本修改不现实啊!一般的做法是提前定义好配置文件的内容,替换掉默认的,然后使用sed -i ‘s/1/2/g’修改里面的ip,打个比方说,nginx的配置文件,我所有的配置文件都一样,然后用sed改掉里面的域名和ip,和网页根目录。
⑷ shell脚本解答
错误:
1. 需要用 test 命令或 [ ] 来测试文件是否可访问并可读。
2. 判断逻辑错误,if 与 else 里的内容颠倒。
3. $#表示参数个数,取第一个参数应该用$1。
4. $1最好用""包含起来,以防文件路径或文件名中有空格。
修改如下:
#!/bin/sh
if [ -r "$1" ]
then
cat "$1"
else
echo "File $1 does not exist or is not readable."
exit 1
fi
exit 0
另外,建议在脚本开头加上对参数个数的判断(如下)。
if [ $# -ne 1 ]
then
echo "Error: You MUST input one parameter!"
echo "Usage: $0 {fileName}"
exit 1
fi
因为按照你的表达,只应该有一个参数,就是文件名(文件全路径)。如果参数个数不是1,需要报错并提示正确的用法。
⑸ 简述shell的参数
我们可以在执行 Shell 脚本时,向脚本传递参数,脚本内获取参数的格式为:$n。n 代表一个数字,1 为执行脚本的第一个参数,2 为执行脚本的第二个参数,以此类推……
实例
以下实例我们向脚本传递三个参数,并分别输出,其中 $0 为执行的文件名:
#!/bin/bash
echo "Shell 传递参数实例!";
echo "执行的文件名:$0";
echo "第一个参数为:$1";
echo "第二个参数为:$2";
echo "第三个参数为:$3";
为脚本设置可执行权限,并执行脚本,输出结果如下所示:
$ chmod +x test.sh
$ ./test.sh 1 2 3
Shell 传递参数实例!
执行的文件名:./test.sh
第一个参数为:1
第二个参数为:2
第三个参数为:3
另外,还有几个特殊字符用来处理参数:
参数处理 说明
$# 传递到脚本的参数个数
$* 以一个单字符串显示所有向脚本传递的参数。 如"$*"用“"”括起来的情况、以"$1 $2 … $n"的形式输出所有参数。
$$ 脚本运行的当前进程ID号
$! 后台运行的最后一个进程的ID号
$@ 与$*相同,但是使用时加引号,并在引号中返回每个参数。 如"$@"用“"”括起来的情况、以"$1" "$2" … "$n" 的形式输出所有参数。
$- 显示Shell使用的当前选项,与set命令功能相同。
$? 显示最后命令的退出状态。0表示没有错误,其他任何值表明有错误。
#!/bin/bash
echo "Shell 传递参数实例!";
echo "第一个参数为:$1";
echo "参数个数为:$#";
echo "传递的参数作为一个字符串显示:$*";
执行脚本,输出结果如下所示:
$ chmod +x test.sh
$ ./test.sh 1 2 3
Shell 传递参数实例!
第一个参数为:1
参数个数为:3
传递的参数作为一个字符串显示:1 2 3
⑹ kshell 如何传递参数给shell和调用参数 以及设置参数的默认值
Example$ ksh shell_script arg1 arg2 ... arg9 arg10 arg11 ...shell_script是shell脚本文件名,而紧跟在后面的arg1 ...argN是参数。1.$# 表示所有参数的个数2.$* 表示所有的参数3.$0 表示shell脚本文件名,譬如在上面的例子是shell_script4.$1...${n} $1表示第1个参数,$10表示第10个参数参数的移位读取语法:shift[n],默认是1位Example$ cat shifty
$ksh shifty param1 param2param1param2参数的默认值设置$cat myscriptprint ${1:-hello}print ${2:-kshell}$ksh myscripthellokshell
⑺ shell脚本里,函数里怎么调脚本参数
是调用这个函数时,传进去的参数~~~
[root@localhost test]# bash shell.sh
haha
[root@localhost test]# cat shell.sh
#!/bin/bash
function fun {
echo $1
}
fun haha
⑻ 如何在shell脚本中修改添加替换指定文件中的内容
1、可以借助于shell命令执行另一个脚本文件或者用变量保存。比如a.sh和b.sh,a.sh中调用b.sh的代码,一起输出"hello world"的字符串。b.sh的代码如下echo " world!"。
⑼ shell脚本可以修改传入参数的值吗
不能,只能间接修改:
tmp=$1
tmp=1123
对tmp可以做任何对变量的操作,而你以后使用的话也使用tmp不再使用$1
⑽ shell脚本进行文件修改
这个文件的内容,是磁盘的分区布局,不能直接修改这个文件,
而应该去修改磁盘的分区结构,
分区改了,这个文件的内容就变了