shell语法基础
一、变量
1、linux大小写敏感,变量取名要注意大小写。可以通过变量名前面加$来访问变量的内容。可以通过使用read命令来将用户输入的值赋给一个变量。
2、给变量赋值时,如果字符串中包含空格,就必须用引号把他们引起了,还要注意在等号两边不能有空格。
3、变量在双引号中会用变量值替换,而在单引号中就不会替换,也可以通过转义字符\来取消$的特殊含义。
例:myvar=“Hi there!”
echo $myvar
echo "$myvar"
echo ' $myvar'
echo \$myvar
将会输出如下:Hi there!
Hi there!
$myvar
$myvar
4、环境变量:环境变量通常用大写字母做名字,为了与环境变量区别开来,用户自定义变量一般都用小写字母。
常用的环境变量有:
二、控制结构
1、shell的布尔判断命令[或test。test的三种条件类型:字符串比较、算术比较和文件有关的条件测试。
2、控制结构
Ø if语句:
if condition
then
statements
else
Statements
Fi
例:#!/bin/sh
if [ -f /root/cherie_test/test_path.sh ];then
echo "/root/cherie_test/test_path.sh exists"
fi
if [ -d /root/cherie_test/test_path.sh ];then
echo "/root/cherie_test/test_path.sh is a director"
else
echo "/root/cherie_test/test_path.sh is not a directory"
fi
解析:[ ]前后都要有空格,不然会报[: missing `]'错误;if与[之间也需要有空格,没有的话会报syntax error near unexpected token `then'错误。
Ø elif语句。对if语句的进一步测试。
例:#!/bin/sh
echo "Is it morning? Please answer yes or no "
read timeofday
if[ $timeofday = "yes"]; then
echo "Good morning"
exit 0
elif [ $timeofday = "no" ];then
echo "Good afternoon"
exit 0
else
echo "Sorry,$timeofday not recognized. Enter yes or no "
exit 1 //异常退出
fi
解析:elif会对在第一个if条件不满足的情况下进行进一步测试,如果两次测试的结果都不成功,就打印出一条错误信息并以1为退出码退出。
Ø for 语句。语法格式:for variable invalues
do
Statements
done
例:#!/bin/sh
for file in $(ls f*.sh); do
lpr $file
done
exit0
解析:打印当前目录中所有以字母f开头的脚本文件。for的参数来着$()中的命令的输出结果,shell扩展f*.sh给出所有匹配此模式的文件的名字。此例中可能会报错lpr: error - scheduler not responding!这是vim配置问题。
Ø while 语句。语法格式: while condition do
Statements
Done
例:#!/bin/sh
foo=1
whlie [ "$foo" -le 20 ]
do
echo "Here we go again"
foo=$(($foo+1))
done
exit 0
解析:测试foo的值,如果它小于20就执行循环体,-le表示小于。
算表达式的使用: count=1
count=$[${count} + 1] 变量加1
Ø until语句。语法格式:until condition
do
Statements
Done
它与while循环很相似,只是把条件测试反过来,循环将执行直达条件为真为止,而不是条件为真时反复执行。
Ø case 语句。语法格式case variable in
pattern statements;;
pattern statements;;
...
esac
注意,每个模式行都以双分号结尾。
例:#!/bin/sh
echo "Is it morning?Please answer yes or no"
read timeofday
case "$timeofday" in
yes|y|Yes|YES)
echo "Good morning"
echo "Up bright and early this morning"
;;
n*|N*) echo "Good afternoon";;
*) echo "Sorry ,answer not recognized";;
esac
exit 0
解析:case语句被执行时,会把timeofday的内容与各个字符串依次进行比较。一旦某个字符串输入匹配成功,case命令就会执行紧随右括号后面的代码。case命令会对用来做比较的字符串就行正常的通配符扩展,因此可以指定字符串的一部分在其后加上*通配符,如n*;只使用一个单独的*表示匹配任何可能的字符串。
三、函数
1、函数的定义。我们只需简单的写出它的名字,然后是一对空括号,再把有关的语句放在一对花括号中,如:function_name () {
Statements
}
例:#!/bin./sh
foo () {
echo "Function foo is executing"
}
echo"script starting"
foo
echo "script ended"
exit 0
运行结果如下: script starting
Function foo is executing
script ended
解析:当遇到foo()结构时,它知道定义了一个名为foo的函数。当执行到foo行时,shell就知道应该去执行刚才定义的函数。
注:在调用一个函数之前必须先对它进行定义。
四、命令
Ø break 命令。终止循环
Ø :命令。冒号(:)命令是一个空命令。它偶尔会被用于简化条件逻辑,相当于true的一个别名。由于它是内置命令,所以它运行的比true快,但它的输出可读性较差。
Ø continue命令。使for、while或until循环跳到下一次循环继续执行。continue可以带一个可选的参数以表示希望继续执行的循环嵌套层数,也就是说你可以部分的跳出嵌套循环。
Ø .命令。点(.)命令用来执行当前shell中的命令。
Ø echo命令。使用echo命令来输出结尾带有换行符的字符串。 常用 echo -n来去掉换行符。
Ø eval命令。eval命令允许你对参数进行求值,有点像一个额外的$。
Ø exec命令。将当前shell替换为一个不同的程序,脚本程序中exec命令后面的代码都不会执行。
Ø exit n命令。exit命令使脚本程序以退出码n结束运行。,退出码0表示成功,退出码1~125是脚本程序使用的错误代码。
Ø export命令。export命令将作为它参数的变量导出到子shell中,并使之在子shell中有效。在默认情况下,在一个shell中被创建的变量在这个shell调用的下级(子)shell中是不可用的。export命令把自己的参数创建为一个环境变量,而这个环境变量可以被其他脚本和当前程序调用的程序看见。
例:脚本export 2
脚本export1
第一个空行的出现是因为变量foo在export2中不可用,所以$foo被赋值为空,echo一个空变量将输出一个空行。Bar用export声明后在export1中仍然有效。
Ø expr命令。expr命令将它的参数当作一个表达式来求值。
Ø printf命令。语法:printf “format string” paremeter1 paremeter2
它支持的转义序列:
Ø return命令。return命令的作用是使函数返回。
Ø set命令。set命令的作用是为shell设置参数变量。还可以通过set命令和它的参数来控制shell的执行方式。其中最常用的命令格式是set -x,它让一个脚本程序跟踪显示它当前执行的命令。
Ø shift命令。shift命令把所有参数变量左移一个位置,使$2变成$1,$3变成$2,依此类推。
Ø trap命令。用于指定在接收到信号后将要采取的行动。trap命令的参数分为两部分,前一部分是接收到指定信号时将要采取的行动,后一部分是要处理的信号名,trap command signal。
Ø unset命令。unset命令的作用是从环境中删除变量或函数。
Ø find 命令。查找文件的功能。语法格式:find [path] [option] [tests] [actions]
一些常用的选项:
测试部分,可以提供给find命令的测试非常多,每种测试返回的结果有两种可能:true或false。find命令开始工作时,它按照顺序将定义的每种测试依次应用到它搜索到的每个文件上。
我们还可以用操作符来组合测试。大多数操作符有两种格式:短格式和长格式,
常见的动作:
Ø grep命令。使用grep命令在文件中搜索字符串。grep语法格式:grep[option] pattern [FILES] 如果没有文件名,则搜索标准输入。
grep命令的一些主要选项:
五、正则表达式
特殊字符:
如果你想将上述字符用作普通字符,就需要在它们前面加上\字符。所以,如果你想使用$字符,只需要简单的将它写为\$。
在方括号中还可以使用一些有用的特殊匹配模式,
匹配字符:
跟踪脚本程序中复杂错误的主要方法是设置各种shell选项。为了完成这一任务,你可以在调用shell时加上命令行选项,各种shell选项:
shell语法基础的更多相关文章
- shell脚本语法基础汇总
shell脚本语法基础汇总 将命令的输出读入一个变量中,可以将它放入双引号中,即可保留空格和换行符(\n) out=$(cat text.txt) 输出1 2 3 out="$(cat te ...
- 详细介绍Linux shell脚本基础学习
Linux shell脚本基础学习这里我们先来第一讲,介绍shell的语法基础,开头.注释.变量和 环境变量,向大家做一个基础的介绍,虽然不涉及具体东西,但是打好基础是以后学习轻松地前提.1. Lin ...
- Groovy语言学习--语法基础(4)
语法基础到此就结束了,毕竟其和Java许多地方并无差别.groovy作为脚本,是为了能更好地随业务变化调整规则,我根据自己对规则的理解 通过一张图简单描述一个groovy脚本场景:由于货币膨胀,经济收 ...
- Ruby语法基础(三)
Ruby语法基础(三) 在前面快速入之后,这次加深对基本概念的理解. 字符串 Ruby字符串可以分为单引号字符串和双引号字符串,单引号字符串效率更高,但双引号的支持转义和运行 puts '单引 ...
- Ruby语法基础(一)
Ruby语法基础(一) Ruby是一种开源的面向对象程序设计的服务器端脚本语言,最初由松本行弘(Matz)设计开发,追求『快乐和生产力』,程序员友好型,被称为『human-oriented langu ...
- 【转】Shell编程基础篇-下
[转]Shell编程基础篇-下 1.1 条件表达式 1.1.1 文件判断 常用文件测试操作符 常用文件测试操作符 说明 -d文件,d的全拼为directory 文件存在且为目录则为真,即测试表达式成立 ...
- 【转】Shell编程基础篇-上
[转]Shell编程基础篇-上 1.1 前言 1.1.1 为什么学Shell Shell脚本语言是实现Linux/UNIX系统管理及自动化运维所必备的重要工具, Linux/UNIX系统的底层及基础应 ...
- (数据分析)第02章 Python语法基础,IPython和Jupyter Notebooks.md
第2章 Python语法基础,IPython和Jupyter Notebooks 当我在2011年和2012年写作本书的第一版时,可用的学习Python数据分析的资源很少.这部分上是一个鸡和蛋的问题: ...
- shell编程基础(转载)
Shell编程基础 原作者 Leal:请参阅页面底部的编者列表. 授权许可: 创作共享署名协议 GNU 自由文档许可证 注意:本文仍然在持续的修订之中,且错漏之处可能较多.如果能够阅读英语的话,可以考 ...
随机推荐
- TCP连接(Time_Wait、Close_Wait)说明
修改Time_Wait和CLOSE_WAIT时间 修改Time_Wait参数的方法 (在服务端修改)Windows下在HKEY_LOCAL_MACHINE/SYSTEM/CurrentControlS ...
- Visual Studio 2015 和 Apache Cordova
英文原版:http://www.codeproject.com/Articles/860150/Visual-Studio-and-Apache-Cordova 在开始前,问一下自己下面这些问题: 熟 ...
- mysql中自己定义函数编程
语法: 新建: Create function function_name(參数列表)returns返回值类型 函数体 函数名,应该合法的标识符,而且不应该与已有的keyword冲突. 一个函数应该属 ...
- [vba]excel中求选中数据和为给定数所有的组合
昨天下午开始学习的vba,累死了,肯定有bug,待调试 vba程序如下: Dim aSum As Integer Dim tSum As Integer ) As Integer Dim arrMax ...
- C++删除字符串中特定的字符
原文:https://snipt.net/aolin/c-6/ //处理string类型的方法del_sp(string &str)待测试 //处理C-Style的方法可用,可以考虑将该方法改 ...
- Java再学习——Executor,ExecutorService,ScheduledExecutorService与Executors
1,Executor.ExecutorService和ScheduledExecutorService,它们都是接口,它们的关系是ScheduledExecutorService继承ExecutorS ...
- mysql ERROR1405 access deny 问题解决
sudo /usr/local/mysql/bin/mysqld_safe --user=mysql --skip-grant-tables --skip-networking 使用这条命令可以跳过开 ...
- 对《[Unity官方实例教程 秘密行动] Unity官方教程《秘密行动》(十二) 角色移动》的一些笔记和个人补充,解决角色在地形上移动时穿透问题。
这里素材全是网上找的. 教程看这里: [Unity官方实例教程 秘密行动] Unity官方教程<秘密行动>(九) 角色初始设定 一.模型设置: 1.首先设置模型的动作无限循环. 不设置的话 ...
- java如何判断字符串是否为空的方法
以下是java 判断字符串是否为空的四种方法: 方法一: 最多人使用的一个方法, 直观, 方便, 但效率很低: if(s == null ||"".equals(s)); 方法二: ...
- 【阿里云产品公测】云引擎ACE -discuz安装
作者:阿里云用户云想未来 谢谢支持.为什么写的比较简单就是为方便新手谁想要很麻烦?亲测按这个教程可以安装成功!时间紧迫不发图片了纯原创 排版您请谅解 进入创建新应用的信息填写界面,此处需要填写一个赠送 ...