#! 的学习
2015-08-19 14:59
246 查看
今天我们来学习#!,菜鸟教程,大神避开.
#!/bin/bash是指此脚本使用/bin/bash来解释执行。
其中,#!是一个特殊的表示符,其后,跟着解释此脚本的shell路径。
bash只是shell的一种,还有很多其它shell,如:sh,csh,ksh,tcsh,...
shell常用的命令包括以下:
cat 文件名 输出文件内容到基本输出(屏幕 or 加>fileName 到另一个文件)
cb
格式化源代码
chmod //change mode,改变文件的权限
cp
copy
date
当前的时间和日期
echo
$abc 在变量赋值之后,只需在变量前面加一个$去引用.
lint 语法检查程序
ls
dir
man
help
more
type
du
查看磁盘空间状况
ps
查看当前进程状况
who
你的用户名和终端类型
定义变量
name=abc? (bash/pdksh) || set name = abc (tcsh)
mkdir
创建目录
rmdir
删除目录
cd
进入目录
rm
删除文件
more
显示文件
echo
显示指定文本
mv
改文件名 /移动文件
pwd
显示目录路径命令
示例1:
#!/bin/bash只能放在第一行,如果后面还有#!,那么只能看成是注释
tbash1.sh:
#!/bin/sh
source abc
echo "hello abc"
tbash2.sh:
#!/bin/bash
source abc
echo "hello abc"
tbash3.sh:
source abc
echo "hello abc"
执行结果:
./tbash1.sh: line 2: abc: No such file or directory
注:当source命令执行有问题时,sh不再往下面执行
./tbash2.sh:
line 2: abc: No such file or directory
hello
abc
注:当source命令执行有问题时,bash继续执行下面命令
./tbash3.sh:
line 1: abc: No such file or directory
hello
abc
注:自身登录系统所在的shell是bash。所以,当source命令执行有问题时,bash继续执行下面命令
示例2:
tbash1.sh:
echo "abc"
#!/bin/sh
source abc
echo "hello abc"
执行结果:
abc
./tbash1.sh: line 3: abc: No such file or directory
hello abc
也就是说,脚本忽略了第二行“#!/bin/sh",直接使用当前所在的shell(也就是bash)来解释脚本
示例3:
#!/bin/sh
#!/bin/bash
source abc
echo "hello abc"
执行结果:
./tbash1.sh: line 3: abc: No such file or directory
当执行完source命令时,并没有往下执行。说明,#!/bin/sh这一行起到作用了,但#!/bin/bash并没有起作用。在脚本中,不在第一行的#!/bin/bash,只是一个注释
示例4:
#!/home/sh
source abc
echo "hello abc"
执行结果:
-bash: ./tbash1.sh: /home/sh: bad interpreter: No such file or directory
系统会提示/home/sh的路径不存在。
#!后面的路径一定要正确,不正确会报错
示例5:
如果一个脚本在第一行没有加上#!+shell路径这一行,那么,脚本会默认当前用户登录的shell,为脚本解释器,如示例1中的tbash3.sh
应该养成脚本首行加上#!+shell路径的习惯
示例6:
/bin/sh相当于/bin/bash
--posix
#!/bin/bash --posix
source abc
echo "hello abc"
执行结果:
./tbash1.sh: line 2: abc: No such file or directory
与tbash1.sh原脚本执行的结果一样
示例7:
/bin/bash --posix与/bin/sh的执行结果相同。总结起来,sh跟bash的区别,实际上是bash有没开启posix模式的区别。遵守posix规范,可能包括,”当某行代码出错时,不继续往下执行
最后加上一点说明,每个脚本开头都使用"#!",#!实际上是一个2字节魔法数字,这是指定一个文件类型的特殊标记,在这种情况下,指的就是一个可执行的脚本。在#!之后,接一个路径名,这个路径名指定了一个解释脚本命令的程序,这个程序可以是shell,程序语言或者任意一个通用程序
#!/bin/bash是指此脚本使用/bin/bash来解释执行。
其中,#!是一个特殊的表示符,其后,跟着解释此脚本的shell路径。
bash只是shell的一种,还有很多其它shell,如:sh,csh,ksh,tcsh,...
shell常用的命令包括以下:
cat 文件名 输出文件内容到基本输出(屏幕 or 加>fileName 到另一个文件)
cb
格式化源代码
chmod //change mode,改变文件的权限
cp
copy
date
当前的时间和日期
echo
$abc 在变量赋值之后,只需在变量前面加一个$去引用.
lint 语法检查程序
ls
dir
man
help
more
type
du
查看磁盘空间状况
ps
查看当前进程状况
who
你的用户名和终端类型
定义变量
name=abc? (bash/pdksh) || set name = abc (tcsh)
mkdir
创建目录
rmdir
删除目录
cd
进入目录
rm
删除文件
more
显示文件
echo
显示指定文本
mv
改文件名 /移动文件
pwd
显示目录路径命令
示例1:
#!/bin/bash只能放在第一行,如果后面还有#!,那么只能看成是注释
tbash1.sh:
#!/bin/sh
source abc
echo "hello abc"
tbash2.sh:
#!/bin/bash
source abc
echo "hello abc"
tbash3.sh:
source abc
echo "hello abc"
执行结果:
./tbash1.sh: line 2: abc: No such file or directory
注:当source命令执行有问题时,sh不再往下面执行
./tbash2.sh:
line 2: abc: No such file or directory
hello
abc
注:当source命令执行有问题时,bash继续执行下面命令
./tbash3.sh:
line 1: abc: No such file or directory
hello
abc
注:自身登录系统所在的shell是bash。所以,当source命令执行有问题时,bash继续执行下面命令
示例2:
tbash1.sh:
echo "abc"
#!/bin/sh
source abc
echo "hello abc"
执行结果:
abc
./tbash1.sh: line 3: abc: No such file or directory
hello abc
也就是说,脚本忽略了第二行“#!/bin/sh",直接使用当前所在的shell(也就是bash)来解释脚本
示例3:
#!/bin/sh
#!/bin/bash
source abc
echo "hello abc"
执行结果:
./tbash1.sh: line 3: abc: No such file or directory
当执行完source命令时,并没有往下执行。说明,#!/bin/sh这一行起到作用了,但#!/bin/bash并没有起作用。在脚本中,不在第一行的#!/bin/bash,只是一个注释
示例4:
#!/home/sh
source abc
echo "hello abc"
执行结果:
-bash: ./tbash1.sh: /home/sh: bad interpreter: No such file or directory
系统会提示/home/sh的路径不存在。
#!后面的路径一定要正确,不正确会报错
示例5:
如果一个脚本在第一行没有加上#!+shell路径这一行,那么,脚本会默认当前用户登录的shell,为脚本解释器,如示例1中的tbash3.sh
应该养成脚本首行加上#!+shell路径的习惯
示例6:
/bin/sh相当于/bin/bash
--posix
#!/bin/bash --posix
source abc
echo "hello abc"
执行结果:
./tbash1.sh: line 2: abc: No such file or directory
与tbash1.sh原脚本执行的结果一样
示例7:
/bin/bash --posix与/bin/sh的执行结果相同。总结起来,sh跟bash的区别,实际上是bash有没开启posix模式的区别。遵守posix规范,可能包括,”当某行代码出错时,不继续往下执行
最后加上一点说明,每个脚本开头都使用"#!",#!实际上是一个2字节魔法数字,这是指定一个文件类型的特殊标记,在这种情况下,指的就是一个可执行的脚本。在#!之后,接一个路径名,这个路径名指定了一个解释脚本命令的程序,这个程序可以是shell,程序语言或者任意一个通用程序
相关文章推荐
- 关于fragment的构造函数问题
- 利用libavdecode进行视频码流的解码流程
- IOS开发 applicationDidBecomeActive 应用程序挂起、复原与终止
- POJ 1094 Sorting It All Out(拓扑排序·判断+实现)
- 数据结构 C语言实现选择排序
- 远程执行命令的psexec工具的基本使用——简单、强大
- 【POJ 1850】 Code
- (leetcode)Ugly Number
- Linux Tomcat 6.0安装配置实践总结
- viewpager获取当前view报空指针的解决方法
- matlab_无约束的非线性优化
- Android 不归路之广播BoradCast篇
- HDU 5400 Arithmetic Sequence(左d1等差右d2等差的区间个数)(枚举位置,求最大区间,算区间个数)
- LinearLayout、RelativeLayout、FrameLayout居中显示整理
- 为什么匿名内部类和局部内部类只能访问final变量
- Eclipse快捷键大全
- 我所认知的软件开发
- js中的json语法
- 利用grunt+browserify预编译js模板文件,支持commonJS加载
- JS提交对象数组到服务端的方法总结(C#实例)