Shell是一种编程语言, 它像其它编程语言如: C, Java, Python等一样也有变量/函数/运算符/if语句/循环控制/… 但在开始之前, 我想先理清Shell语言与Shell之间的关系.
上面说了Shell是一种编程语言但你可能也听说过: sh/bash/csh/zsh/…它们也叫Shell, 实际上这里所说的Shell是一种应用程序, 它负责解释执行你编写的Shell脚本, Mac默认就自带了sh/bash/csh/zsh/tcsh/ksh, 你可以这样查看cat /etc/shells
不同的shell的用法基本相同, 但有些shell提供了一些新特性, 比如我现在在用的就是zsh
#! /bin/sh
echo "hello shell!"
依国际惯例这里以在终端里打印一句hello shell!开始, 第一行的#!是一个约定标记, 它告诉脚本这段脚本需要什么解释器来执行. 第二行的echo命令则负责向屏幕上输出一句话.
运行shell程序有3种方法:
通常情况下, 最方便的方式就是方式1, 通过方式1执行你需要在脚本第一行写好这段脚本由哪个解释器来解释, 而通过方式2来执行则没有这个限制, 写了也没用.
除此之外方式1与方式2执行命令就没有区别了, 但方式3执行的方式与前两种都不同:
使用source执行shell脚本时, 不会创建子进程, 而是在父进程中直接执行!
和其它语言一样Shell中也有变量, 而且更简单, 但有一些比较特殊的地方.
variable_name=ghui
需要注意: = 两边不能加空格, 当赋值语句包含空格时请加引号(单引号/双引号均可)比如:
variable_name="ghui's blog"
Shell中的变量可以分为两种类型:
与其它语言一样局部变量的可见范围是代码块或函数内, 全局变量在全局范围内可见.看个简单的例子:
#! /bin/sh
num=111 #全局变量
func1()
{
local num=222 #局部变量
echo $num
}
echo "before---$num"
func1
echo "after---$num"
输出:
before---111
222
after---111
使用一个定义过的变量, 只要在变量名前面加$即可, 如:
name=ghui
echo $name
echo ${name} #{} 为了帮助解释器识别变量边界, 非必须
在使用变量时还有一个地方需要注意, 请看下面的例子:
#! /bin/sh
str='abc'
echo "1 print $str"
echo '2 print $str'
输出:
1 print abc
2 print $str
即:
被双引号括起来的变量会发生变量替换, 单引号不会
Shell中注释使用#, 而且它不支持多行注释.
name="shell"
sayHi="hello, "$name" !"
sayHi2="hello, ${name} !"
echo $sayHi $sayHi2
注意: 上面说的单双引号引起的变量替换问题
string="abcd"
echo ${#string} #输出:4
str="hello shell"
echo ${str:2} #输出: llo shell
echo ${string:1:3} #输出:ell
基本语法结构:
if condition
then
do something
elif condition
then
do something
elif condition
then
do something
else
do something
fi
其中, elif语句和else语句非必须的.看个例子:
#! /bin/sh
a=1
if [ $1=$a ]
then
echo "you input 1"
elif [ $1=2 ]
then
echo "you input 2"
else
#do nothing
echo " you input $1"
fi
很简单, 不过这里有两个地方需要注意, 如果某个条件下的执行体为空, 则你就不能写这个条件 即下面这样会报错:
if condition
then
#do nothing
elif condition
then
# do nothing
#or
else
#do nothing
另外, [ ] 两边一定要加空格, 下面这样都会报错:
if [$a=$b]
#or
if [ $a=$b]
#or
if [$a=$b ]
只有这样if [ $a=$b ]才是对的.
注意: 实际上这里的[]是test命令的一种形式, [是系统的一个内置命令,存在路径是/bin/[,它是调用test命令的标识, 右中括号是关闭条件判断的标识, 因此下面的两个测试语句是等效的:
if test "2>3"
then
...
fi
和
if [ "2>3" ]
then
…
fi
除[]之外, shell语言中还有几种其它括号, 比如: 单小括号/双小括号/双中括号/… , 不同的括号有不同的用法
当条件较多时, 可以选择使用switch语句, shell中的switch语句的写法和其它语言还是有些不同的, 基本结构如下:
case expression in
pattern1)
do something... ;;
pattern2)
do something... ;;
pattern2)
do something... ;;
...
esac
看个例子:
#! /bin/sh
input=$1
case $input in
1 | 0)
str="一or零";;
2)
str="二";;
3)
str="三";;
*)
str=$input;;
esac
echo "---$str"
这个例子会根据你执行此脚本时传入的参数不同在屏幕上输出不同的值, 其中第一个case 1 | 0代表逻辑或.
NOTE:
基本结构:
for name [in list]
do
...
done
其中,[]括起来的 in list, 为可选部分, 如果省略in list则默认为in "$@", 即你执行此命令时传入的参数列表.
看个例子:
for file in *.txt
do
open $file
done
遍历当前目录下的所有txt文件, 并依次打开.
基本结构:
while condition
do
do something...
done
看个例子:
#! /bin/sh
i=0
while ((i<5));
do
((i++))
echo "i=$i"
done
输出:
i=1
i=2
i=3
i=4
i=5
NOTE: 你可能需要去了解一下(())的用法
基本结构
until condition
do
do something...
done
看个例子:
#! /bin/sh
i=5
until ((i==0))
do
((i--))
echo "i=$i"
done
输出:
i=4
i=3
i=2
i=1
i=0
shell中也支持break跳出循环, continue跳出本次循环.用法与C, Java中相同
要定义一个函数, 可以使用下面两种形式:
function funcname()
{
do something
}
或者
funcname ()
{
do something
}
看个例子
#! /bin/sh
# ad.sh 计算sum
add()
{
let "sum=$1+$2"
return $sum
}
add $1 $2
echo "sum=$?"
输入
ad 1 2
输出
sum=3
其中, $?在shell中保存的是上一条命令的返回值
NOTE:
先shell脚本传递参数, 非常简单, 只需要在你执行命令的后面跟上即可, 看个例子:
#! /bin/sh
# test.sh
echo "$# parameters";
echo "$@";
echo "$0"
echo "$1"
输入:
test.sh 11 22
输出:
2 parameters
11 22
test.sh
11
本文的目标是对three.js进行简要介绍。我们将从设置一个(案例)场景开始,使用一个旋转的立方体。在页面底部提供一个工作示例,以防您遇到困难,需要帮助。
MongoDB 是一个基于分布式文件存储的数据库。是一个介于关系数据库和非关系数据库之间的产品。这篇文章讲解mongodb shell 运行js脚本的四种方式。
async 对于应用脚本的用处不大,因为它完全不考虑依赖(哪怕是最低级的顺序执行),不过它对于那些可以不依赖任何脚本或不被任何脚本依赖的脚本来说却是非常合适的,最典型的例子:Google Analytics
本文介绍如何编写 JavaScript 脚本,将用户数据发回服务器。数据发回服务器的常见做法是,将收集好的用户数据,放在unload事件里面,用 AJAX 请求发回服务器。
如果遇到一个类似的需求,比如执行npm publish命令前想先升级下项目的版本,基础操作是在shell中输入两次命令分别为npm run version和npm run publish,但是有没有更简单的方法呢?请看下面的内容:
脚本写的好,下班下得早!程序员的日常工作除了编写程序代码,还不可避免地需要处理相关的测试和验证工作。例如,访问某个网站一直不通,需要确定此地址是否可访问,服务器返回什么,进而确定问题在于什么
今天主要分享两个shell脚本实例,内容不重要,重点是看如何去实现。批量创建特殊要求用户,需求:批量创建10个系统帐号hwb01-hwb10并设置密码(密码为随机数,要求字符和数字等混合)。
本文将会介绍如何将 FIBJS 脚本打包成Windows 上的 exe 可执行文件。FIBJS 是一个主要为 Web 后端开发而设计的应用服务器开发框架,它建立在 Google v8 JavaScript 引擎基础上
Hershell是一款功能强大的跨平台反向Shell生成器,该工具使用Go语言开发,基于TCP反向Shell实现其功能。该工具使用了TLS来保障数据通讯的安全性,并且提供了证书公共密钥指纹绑定功能来防止通信数据被拦截。
defer是脚本程序强大功能中的一个“无名英雄”。它告诉浏览器Script段包含了无需立即执行的代码,并且,与SRC属性联合使用,它还可以使这些脚本在后台被下载,前台的内容则正常显示给用户。
内容以共享、参考、研究为目的,不存在任何商业目的。其版权属原作者所有,如有侵权或违规,请与小编联系!情况属实本人将予以删除!