Shell入门知识-程序员宅基地

技术标签: shell  操作系统  php  

Shell 简介

Shell作为命令语言,它交互式地解释和执行用户输入的命令;作为程序设计语言,它定义了各种变量和参数,并提供了许多在高级语言中才具有的控制结构,包括循环和分支。

常常作为批处理命令来使用,用来提高生产效率!

入门

下面是Shell的一段简单入门程序,我们在Linux上面使用vi test.sh然后将下面的代码打进去,运行sh test.sh 即可

#!/bin/bash    

echo "Hello World !"

上面这段程序是输出HelloWorld,其中#!/bin/bash 指定编译器,必须在脚本的第一行,echo输出信息,这里为输出Hello World

如何运行这段程序呢, 第一步首先进入到该脚本所在的目录,比如cd /root/shelltest ,运行命令sh test.sh 这样就可以进行输入了。

程序中的变量

定义全局变量

全局变量一直存在,不会因为切换shell终端或者退出登录而消失,全局变量需要在 /root/.bush_profile 、/etc/bashrc、/etc/profile、/etc/profile.d文件中设置,设置的格式为export name=value

在/etc/profile中定义完成后,需要重新加载配置文件 source /etc/profile

1260476-20171103150405123-606247802.png

其中在/etc/profile.d设置shell脚本可以在启动shelle客户端的时候就执行这个脚本,这个文件夹中存储的都为脚本。

创建脚本内容如下

1260476-20171103150820498-2018528319.png

则新打开客户端的时候则会执行这个脚本,输出对应的内容。

1260476-20171103150900060-393935917.png

定义局部变量, 局部变量在退出Shell客户端时会失效

1260476-20171103151041248-1504889757.png

单引号双引号的区别

单引号:原样输出

双引号:如果里面有变量,会输出变量

没有引号:输出变量

1260476-20171103151507232-60202259.png

传递的参数

可以在调用脚本的时候给脚本传递参数,脚本内使用$1 $2 ...... 接受传递的参数,当参数超过9的时候,需要用花括号括起来 ${10}

特殊的调用参数:

    $0:返回Shell文件名称
    $$:当前脚本的PID
    $#:传递的所有参数
    $@:程序中的所有参数,这是将参数传递给其他程序的最佳方式。
    $! :执行的上一个命令的PID
    $?:上一次指令的返回值
    $_:此命令前面的最后一个参数
    $* :获取所有的参数

1260476-20171103163204576-1003048977.png

1260476-20171103163230670-259628726.png

不同脚本之间访问变量

使用sh命令启动的脚本,则在脚本结束其内部的属性都会消失,其他的脚本不能访问其内部的属性。

1260476-20171103164108998-1068496250.png

使用source 命令启动脚本,则在脚本结束后其属性不会失效,同时其他的脚本也能访问到。

1260476-20171103163932341-1188222045.png

取消变量

使用unset可以取消变量,这个变量包括环境变量和局部变量

1260476-20171103164226763-1182432745.png

数组

数组中可以存放多个值。Bash Shell 只支持一维数组(不支持多维数组),初始化时不需要定义数组大小(与 PHP 类似),数组下标从0开始。

定义数组

    array=(value1 value2 value3)
    
    array_name[0]=value0

读取数组

${array_name[index]}

获取数组中全部的元素

${my_array[@]}

获取数组的长度

${#my_array[*]}

流程控制

if

如果else语句中没有执行语句,不可以写

if condition
then
    command1 
    command2
    ...
    commandN 
fi

------------------

if condition
then
    command1 
    command2
    ...
    commandN
else
    command
fi

------------
if condition1
then
    command1
elif condition2 
then 
    command2
else
    commandN
fi
for
for var in item1 item2 ... itemN
do
    command1
    command2
    ...
    commandN
done
while
while condition
do
    command
done
until

类似do-while循环,在最后判断条件,最少执行一次

until condition
do
    command
done
case
case 值 in
模式1)
    command1
    command2
    ...
    commandN
    ;;
模式2)
    command1
    command2
    ...
    commandN
    ;;
esac

函数

demoFun(){   // 定义  
    echo "这是我的第一个 shell 函数!"
}
echo "-----函数开始执行-----"
demoFun   // 调用,如果需要传递参数直接在后面跟就好  demoFun 1 2 3
echo "-----函数执行完毕-----"

运算符

  • expr 是一款表达式计算工具,使用它能完成表达式的求值操作。

  • expr 2 + 2 使用方法 , 需要注意的为1.表达式和运算符之间要有空格 2. 需要用``引起来

关系运算符

1260476-20171106095156231-887101809.png

使用方法:

if [ $a -eq $b ]
then
   echo "$a -eq $b : a 等于 b"
else
   echo "$a -eq $b: a 不等于 b"
fi
布尔运算符

1260476-20171106095304434-1620179972.png

使用方法

if [ $a -lt 100 -a $b -gt 15 ]
then
   echo "$a 小于 100 且 $b 大于 15 : 返回 true"
else
   echo "$a 小于 100 且 $b 大于 15 : 返回 false"
fi
逻辑运算符

1260476-20171106095401809-1472240688.png

字符串运算符

1260476-20171106095415966-1213211426.png

文件测试运算符

1260476-20171106095440403-1230456731.png

转载于:https://www.cnblogs.com/liyuhui-Z/p/7792108.html

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/as1406181/article/details/101567760

智能推荐

BZOJ2095 POI2010 Bridges 【二分+混合图欧拉回路】_二分图欧拉回路-程序员宅基地

BZOJ2095 POI2010 BridgesDescriptionYYD为了减肥,他来到了瘦海,这是一个巨大的海,海中有n个小岛,小岛之间有m座桥连接,两个小岛之间不会有两座桥,并且从一个小岛可以到另外任意一个岛。现在YYD想骑单车从小岛1出发,骑过每一座桥,到达每一个小岛,然后回到小岛1。霸中同学为了让YYD减肥成功,召唤了大风,由于是海上,风变得十分大,经过每一座桥都有不可..._二分图欧拉回路

Ubuntu下编译安装Mysql双实例并配置主从复制-程序员宅基地

一.安装前准备 下载Mysql源码包:推荐官方站点http://www.mysql.com/ 配置Ubuntu环境 添加mysql用户组和用户: groupadd mysql useradd -g mysql mysql 创建安装所需目录 master实例安装目录: mkdir /opt/mas

Android系统新建APN代码_apn_list_uri-程序员宅基地

xml权限配置 package="com.lc.NewAPN" android:versionCode="1" android:versionName="1.0" > android:icon="@drawable/i_apn_list_uri

二级导航页面+当前页面导航高亮显示_二级导航的网页-程序员宅基地

html部分页面代码: class="webnav"> class="nav_list"> href="CDKQWeb/PublicWeb/PublicWeb/Index.w.xhtml">首页 href="CDKQWeb/PublicWeb/PublicWeb/ScienceEn_二级导航的网页

程序性景观实验-程序员宅基地

Rust的99 LoC中快速而又肮脏的过程生成 几天前,我尝试创建一个程序性景观生成器。 这是实际结果: https : //rap2hpoutre.github.io/landscape-site/ 我想知道事情是如何运作的。 这就是我建造那个的方式。 山脉 我不是一个优秀的程序员,也不知道如何创建山脉。 我在Stack Exchange上找到了这个答案: https : //game...

UITextField小结-程序员宅基地

//初始化textfield并设置位置及大小 UITextField *text = [[UITextField alloc]initWithFrame:CGRectMake(20, 20, 130, 30)] //设置边框样式,只有设置了才会显示边框样式  text.borderStyle = UITextBorderStyleRoundedRect; typedef enu

随便推点

java学习之旅66--常用类_DateFormat和SimpleDateFormat_时间和字符串的互相转换-程序员宅基地

DateFormat和SimpleDateFormatDateFormat是一个抽象类,其只有一个实现类SimpleDateFormatpublic class TestDateFormat { public static void main(String[] args) { DateFormat dateFormat = new SimpleDateFormat("yyyy

java system.load,Java System类loadLibrary()方法及示例_叶深深的博客-程序员宅基地

系统类loadLibrary()方法loadLibrary()方法在java.lang包中可用。loadLibrary()方法用于使用名为library_name(library name)的给定参数作为在该方法中传递的参数来加载库。一个Java文件可能包含我们需要使用loadLibrary()方法加载该库的本机代码。在此方法中,以特定于系统的方式完成了从library_name到给定文件名的映射..._java loadlibrary

WinForm自定义日历控件完整源码附注释_winform日历控件_LilyCoder的博客-程序员宅基地

WinForm自定义日历控件完整源码附注释_winform日历控件

南昌大学利用计算机作弊怎样处分,关于江西南昌大学医学院计算机中心教师组织全国计算机二级考试集体作弊的意见书..._Gonnch的博客-程序员宅基地

江西南昌大学医学院计算机中心教师组织全国计算机二级考试集体作弊1首先在此向你真诚道歉 我确实也没有谩骂也没有指责谁我在论坛里也只是质问他们,想让你们出来说话。他们教师组织集体作弊 开办培训班,可以借用教室吗?学校规定我再去查下2。安排考试座位,一直是考试中心安排是上机考试把他们报了培训班的安排在三楼机房 可以自由翻书 回收站里就有答案 有的人不会打字老师还帮他做题没有报他们培训班的就安排在二楼 ...

c和cpp实现CPU核上绑定固定线程_cpu固定绑定在大核上_埋头干饭ing的博客-程序员宅基地

刚开始接触cpu_set_t时,对_S系列接口有疑问,不明白它存在的意义,明明自己malloc一个cpu_set_t就可以,然后使用各种非_S对其操作,为什么非要有_S系列接口呢?这种状态正是我们希望的,因为进程迁移的频率小就意味着产生的负载小。就是进程要在某个给定的CPU上尽量长时间的运行而不被迁移到其他处理器的倾向性。将当前的pid绑定到4,5,6,7核上(大核核超大核)cpu_set_t用来描述CPU的集合,被。设置线程亲和性,将线程绑定到指定CPU核。cpuset:CPU核的集合。_cpu固定绑定在大核上

linux alias 别名应用-程序员宅基地

linux alias 别名应用举例:别名:alias de='cd /home/jboss/standalone/deployments/'alias class='cd /home/jboss/standalone/deployments/pstim.war/WEB-INF/classes/'alias rs='service JBOSS restart'永久生效:vi ~/.bashrc