⑴ 一个bash shell脚本的第一行是什么 命令为
#!/bin/bash
一般是这样的。
⑵ 不过时的技术——Bash脚本
Bash是一种不需要编译,直接运行在Unix/Linux系统之上的脚本程序。它可以只包含一些简单的命令,顺序执行;也可以包含变量、控制语句等复杂的语法结构。Unix/Linux系统一直就是计算机世界的基石,Bash也是系统管理员、程序员必须掌握的技术之一,很多工作都可以借助Bash自动执行。甚至Unix/Linux系统本身的很多功能,也是由Bash实现的。随意打开 /etc/init.d/ 目录下的某个文件,会发现就是一个Bash脚本,在Linux中,存在这大量这样的脚本。
上面的脚本看似复杂,但从结构上可以简单划分为四部分:
1. 第一行 #! /bin/sh 叫 shebang ,标明这是一个Shell脚本。
2. 后面以 # 打头的是注释,说明该脚本的作用及用法。
3. 中间一大段是命令及控制语句,这里是真正做事的地方。
4. 最后 exit 0 ,退出脚本。
一个Linux命令执行后,都会有一个返回值, 0 表示命令执行成功, 1 表示命令执行过程中出错,根据错误的不同,还可能返回 2 、 3 、 4 等值。在Linux中,变量 $? 记录了上次命令的返回值。使用 echo $? 可以查看上次命令执行成功与否。Bash脚本的返回值默认为最后一条命令的返回值,很多时候这并不是我们想要的结果,因此常常在脚本最后使用 exit 0 显式声明返回值。
遵循上面的规则,我们可以编写出自己的第一个Bash脚本: hello_world ,它的作用是在命令行打印一条消息。
切换到该脚本所在目录, bash hello_world 运行该脚本,不出意外的话,恭喜你写出了第一个Bash脚本。
通常人们不采用 bash hello_world 这种方式运行Bash脚本,而是赋给脚本可执行权限,直接运行脚本:
有些同学会在运行脚本时碰到一个问题:既然已经在当前目录下,为什么直接运行 hello_world 会报命令找不到的错误?这是因为 当前目录并不包含在$PATH 路径下。Linux执行一个程序时,总是在系统环境变量$PATH里找对应的可执行程序,如果找不到,就会报命令找不到的错误。我们可以打印出$PATH变量 echo $PATH ,显然,当前路径并没有包含在里面。
为了方便,系统管理员通常把Bash脚本保存在 /usr/local/bin 和 $USER/bin 目录下,因为这些目录默认包含在系统环境变量$PATH里。我喜欢在当前用户目录下新建一个 bin 目录,然后将该目录加入$PATH,就可以直接在这里编写Bash脚本了。
编写Bash脚本时手一滑,可能会将脚本命名为 test ,此时执行脚本会得到意想不到的结果:
使用 which 和 type 命令检查后发现,事实上执行了一条内置的Linux命令。此时就需要明确指定路径来执行该脚本了: ./test 。最好是能在命名时注意冲突,随着对Linux的熟悉,这种情况会慢慢好起来的。
最后为大家布置一道练习题:编写一个Bash脚本,在当前目录下生成一个日志文件,随意输入一些内容,备份该文件,并将原始日志文件内容清空。如果对Linux命令不熟悉,可能要查阅一些资料:如何输出一些文本到文件、如何清空文件内容等。
读者若对Bash脚本感兴趣,可阅读 Advanced Bash-Scripting Guide 深入学习,祝大家学习快乐!
⑶ 为什么shell脚本第一行要#!/bin/sh这个是什麽意思呢
告诉操作系统, 此脚本的解释器为 /bin/sh 这个可执行文件
类似地, 如果你的脚本用 bash, ksh, 解释, 第一行就应该是
#!/bin/bash
#!/bin/ksh
之类的
或者, 你自己定义一种脚本语言, 再自己写个解释器去执行它, 比如说叫 xshell, 放在 /usr/local/bin 下, 你的脚本第一行就应该是
#!/usr/local/bin/xshell
如果没有这样定义的第一行, 不同 unix 类操作系统会用默认 shell 来解释脚本, 如 unix 往往是 sh, linux 往往是用 bash, ....
⑷ 求写一个bash脚本
脚本如下。
#!/bin/bash
# default
ip=192.168.168.168
count=3
if [ $# -eq 2 ]; then
[[ $1 =~ ^([0-9]+\.){3}[0-9]+$ ]] && ip=$1
[[ $2 =~ ^[0-9]+$ ]] && count=$2
elif [ $# -eq 1 ]; then
if [[ $1 =~ ^([0-9]+\.){3}[0-9]+$ ]]; then
ip=$1
elif [[ $1 =~ ^[0-9]+$ ]]; then
count=$1
fi
fi
ping -n $count $ip >>$(date +%Y-%m-%d-%H-%M-%S).log
[ $? -ne 0 ] && 这里写restart pppd的代码
exit 0
说明:
1)运行脚本时可以带两个参数,第一个指示ip,第二个指示ping的次数;若输入不符合格式要求,使用默认值。
2)若只提供了一个参数,脚本自动根据格式判断是ip还是ping的次数;另一个使用默认值。
3)若提供的参数个数超过两个,只取前两个,格式判断参见1)。
4)若没有提供参数,都使用默认值。
5)因为没用过pppd,所以重启pppd的代码由你自行补上。
⑸ 编写linux shell一个脚本,要求如果第一个位置参数是合法目录,那么就把后面给出的各个位置参数所对应的文
在上网浏览了恶意网页后,经常会遇到注册表被禁用的事情。注册表被加锁,其主要原理就是修改注册表。在注册表HKEY_CURRENT_USER\Software\Microsoft\Windows\
CurrentVerssion\Policies\System分支下,新建DWORD值“Disableregistrytools”,并设键值为“1”。这样,当有人运行注册表编辑器时就会出现“注册编辑已被管理员所禁止”的对话框(如图1),这样就可以达到限制别人使用注册表编辑器的目的。给注册表解锁的方法有很多,编辑REG文件导入注册表是最常用的。本文要介绍的是与众不同的七招,在此与您分享。
用Word的宏来解锁
Word也可以给注册表解锁?没错!我们利用的是微软在Word中提供的“宏”,没想到吧?具体方法是:运行Word,然后编写如下面所示的这个“Unlock”宏,即可给注册表解锁:
Sub Unlock()
Dim RegPath As String
RegPath = “HKEY_CURRENT_USER\Software
\Microsoft\Windows\CurrentVersion\Policies\System”
System.PrivateProfileString(FileName:=“”,Section:=RegPath,Key:=“Disableregistrytools”)=“OK!”
End Sub
其实,这个方法一点都不神秘,只是利用了注册表的一个特性,即在同一注册表项下,不能有相同名字的字符串值和DWORD值,如果先前有一个DWORD值存在,则后建立的同名的字符串值会将其覆盖,这也就间接的删除了原值。在本例中就是DWORD值Disableregistrytools被同名的字符串值所覆盖删除。
修改Regedit.exe文件
修改Regedit.exe文件也可以给注册表解锁,前提条件是手头上要有十六进制文件编辑软件如UltraEdit或WinHex等。我们以UltraEdit为例,用Ultraedit打开注册表编辑器Regedit.exe。点击“搜索”菜单下的“查找”,在弹出的对话框中的“查找ASCII字符”前面打上“√”,在“查找什么”栏中输入:Disableregistrytools(如图2),点击“确定”开始查找。会找到仅有的一处结果,改成别的字符就可以了。不过长度一定要一样(20个英文字母),这样就可以解除对注册表编辑器的禁用。
使注册表编辑器无法被禁用
给注册表编辑器Regedit.exe做个小手术,使之对注册表禁用功能具有“免疫力”,可以打造一个锁不住的注册表编辑器。这对防范恶意网页对注册表的禁用非常有好处。用十六进制文件编辑器Ultraedit打开Regedit.exe,查找74 1B 6A 10 A1 00,找到后,把74改为EB即可。现在,你就有了一个锁不住的注册表编辑器了。下次既使注册表被禁用也不用害怕了,只管运行之,保管恶意网页的修改无效。
用INF文件解锁
大家一定看到过在Windows中有一种后缀为INF的驱动安装文件,它实际上是一种脚本语言,通过解释执行。它包含了设备驱动程序的所有安装信息,其中也有涉及修改注册表的相关信息语句,所以我们也可以利用INF文件对注册表解锁。
INF文件是由各个小节(Section) 组成。小节的名字从中括号中起,且在此文件中必须是惟一的。小节的名字是它的入口点。后面是小节内容,形式上是“键名称=键值”。在文件中可以添加注释,由分号完成,分号后的内容不被解释执行。让我们开始行动,用记事本编辑如下内容的文件:
[Version]
Signature=“$CHICAGO$”
[DefaultInstall]
DelReg=del
[del]
HKCU,Software\Microsoft\Windows\CurrentVersion\Policies\
System,Disableregistrytools,
1,00,00,00,00
将上面的内容存为del.inf,使用时用右键点击它,在弹出菜单中选择“安装”即可给注册表解锁(如图3)。
用JScript解锁
用记事本编辑如下内容的文件,保存为以.js为后缀名的任意文件,使用时双击就可以了。
VAR WSHShell=WSCRIPT.CREA-TOBJEt(“WSCRIPT.SHELL”);
WSHShell.Popup(“为你解锁注册表”);
WSHShell.RegWrite(“HKCU\\Software\\Microsoft\\
Windows\\CurrentVersion\\Policies\\
system\\DisableRegistryTools”, 0,“reg_dword”);
大家可以看出用JS对键值进行操作时要用两斜杠“\\”,并且要用“;”表示结束。一般只要能注意这两点,就没有问题了。
用VBScript解锁
用VBScript对注册表进行解锁?没错!很容易又很简单的一个方法,用记事本编辑如下内容:
DIM WSH
SET WSH=WSCRIPT.CreateObject(“WSCRIPT.SHELL”)
WSH.POPUP(“为你解锁注册表!”)
WSH.Regwrite“HKCU\Software\Microsoft\Windows\
CurrentVersion\Policies\System\DisableRegistryTools”,0,“REG_DWORD”
WSH.POPUP(“注册表解锁成功!”)
将以上内容保存为以.vbs为扩展名的任意文件,使用时双击即可。
⑹ 使用bash脚本,使用for循环和arg参数编写一个实现将命令行的多个参数逆序输出的程序
脚本自己写了一个,可能不完全符合条件2要求(cmd变量没用上),但是逆序打印词串大概没问题,你自己试下:
#!/bin/bash
count=$#
for arg in $*
do
echo -n "${count} "
let "count=count-1"
done
第一个问题的答案:vi,或者你写vim也对,一般vi是vim的链接,运行命令行下的vi编辑器。
第二个问题没看明白要cmd这个变量啥用,可能是我愚钝,我不知道怎样重定向一个字符串追加到一个变量的末尾,想了个变通的方法。
第三个问题的答案:chmod 0750 /<到脚本位置的绝对路径>/<脚本文件名>
第四个问题的答案:你把这串字符按照空格隔开为一个单元的规律倒序写即可,就是这样ddff gdd ddd ac ab aa
⑺ shell脚本中,怎样比较第一个参数是否与某字符串匹配
if test “$1” = "delete"
then
......
fi
第一个参数用 $1 来取得。
⑻ bash脚本文件中为什么以#!开头
在每个bash脚本的开头都使用#!,这用来告诉系统此文件的执行需要指定一个解释器。“#!”实际上是一个 2 字节的魔力数字,这是指定一个文件类型的特殊标记,换句话说, 在这里指是一个可执行的脚本(键入 man magic 来获得关于这个迷人话题的更多详细信息)。在“#!”之后接着是一个路径名,这个路径名指定了一个解释脚本中命令的程序,这个程序可以是 shell,其它编程语言或任意一个通用程序。这个指定的程序从头开始解释并且执行脚本中的命令(从#!行下边的一行开始),忽略注释。
如:#!/bin/sh
#!/bin/bash
#!/usr/bin/perl
#!/usr/bin/tcl
#!/bin/sed -f
#!/usr/awk -f
上边每一个脚本头的行都指定了一个命令解释器,如果是/bin/sh,那么就是默认shell(在 Linux 系统中默认是 Bash)。使用#!/bin/sh,在大多数商业发行的 UNIX 上,默认是 Bourneshell,这将让你的脚本可以正常的运行在非 Linux 机器上,虽然这将会牺牲 Bash 一些独特的特征。脚本将与 POSIX 的 sh 标准相一致。
注意: #! 后边给出的路径名必须是正确的,否则将会出现一个错误消息,通常是Command not found,这将是你运行这个脚本时所得到的唯一结果。当然#!也可以被忽略,不过这样你的脚本文件就只能是一些命令的集合,不能够使用 shell 内建的指令了。
脚本中的#!行的最重要的任务就是命令解释器(sh 或者 bash)。因为这行是以#开始的,当命令解释器执行这个脚本的时候,会把它作为一个注释行。当然,在这之前,这行语句已经完成了它的任务,就是调用命令解释器。
注:那些具有 UNIX 味道的脚本(基于 4.2BSD)需要一个 4 字节的魔法数字,在#!后边需要一个空格#! /bin/sh。本文来源:《Shell编程从入门到精通》
⑼ linux中shell脚本第一行怎么写
第一行一般写如下语句:
#!/bin/bash
如果计入命令的话就直接一行写一条命令
如果输入的命令作为参数的话需要加<<EOF等
这个是我写的简单脚本
#!/bin/bash
su - oracle <<EON
export ORACLE_SID=trade
lsnrctl stop
sqlplus /nolog <<EOF
conn / as sysdba
shutdown immediate
exit
EOF
第一行后加 -x是显示输出的意思,整体是用root执行启动数据库启动监听
学习shell可以参考:http://c.biancheng.net/cpp/view/6994.html
希望能帮到您!
⑽ 请问shell脚本第一行 -f的含义: #!/usr/bin/awk -f 这个位置还有哪些值,分别表示什么
Linux下脚本的第一行#! 是指明本脚本使用哪个解释器来执行当前脚本,从头文件看出这个一个awk脚本,第一行的意思可以理解为 使用 /usr/bin/awk -f 脚本名 来执行当前脚本:
比如脚本:test.awk的第一行是#!/usr/bin/awk -f那么执行这个脚本的时候就会根据第一行去寻找解释器,效果相当于在shell下执行
/usr/bin/awk -f test.akw
这里的-f是awk命令的一个参数,是从文件中读取脚本执行的意思.