Shell:一般我们是用图形界面和命令去控制计算机,真正能够控制计算机硬件(CPU、内存、显示器等)的只有操作系统内核(Kernel),由于安全、复杂、繁琐等原因,用户不能直接接触内核,需要另外再开发一个程序,让用户直接使用这个程序;该程序的作用就是接收用户的操作(点击图标、输入命令),并进行简单的处理,然后再传递给内核,内核和用户之间就多了一层“中间代理”,Shell 其实就是一种脚本语言,也是一个可以用来连接内核和用户的软件,我们编写完源码后不用编译,直接运行源码即可。
常用的Shell:bash由 GNU 组织开发,sh 是 UNIX 上的标准 shell,是第一个流行的 Shell,bash保持了对 sh shell 的兼容性,是各种 Linux 发行版默认配置的 shell。现在sh 已经基本被 bash 代替,bash是sh的扩展补充,但是也有些是不兼容的,大多数情况下区别不大,特殊场景可以使用 bash 代替 sh。
在ubuntu下,上图是我们打开的终端,这里输入的命令就是我们shell的命令,一般$表示的是普通用户,而#表示的是超级用户(root)
目录
在终端创建一个.sh文件,vi test.sh
第一行,#!是一个约定的标记,它告诉系统这个脚本需要什么解释器来执行,用的是哪种shell,后面的/bin/bash
就是指明了解释器的具体位置。 第二行#是注释行,用来解释说明,当然#!是特殊的,不在此类。 第三行在是终端输出 hello,is me!
执行shell脚本:
./test.sh: ./表示当前目录,执行./test.sh会说明权限不够,不能执行。需要改变文件的权限:chmod 777 test.sh,就能执行
. ./test.sh: 在不想改变权限的时候,测试脚本是不是能够正常使用。. 临时增加权限。
#!/bin/bash
#获取字符串长度
str="123456"
echo "${#str}"
结果:
在bash shell中,每一个变量的值都是字符串, 当然也可以用declare 关键字显式定义变量的类型,在赋值的时候等号两边不能有空格,如:str=1 ,str='1' ,str="1",变量名必须有字母、下划线、数字组成,开头必须字母或者下划线,不能用shell。
使用shell变量在变量前面加一个$,而标准的是 &{},目的是在一长串字符中可以识别出这个变量,而不会引起误会,如下:
#!/bin/bash
#引用shell变量
str="abc"
echo "$str"
echo "the str vaile is: $str1"
#后面增加一个1,就不能正确的识别变量
echo "the str vaile is: ${str}1"
#所以我们引用变量,最好统一用 ${} 的形式
结果:
a)、shell变量的赋值:
#!/bin/bash
#变量的赋值
n=1
v1=${n}
v2='${n}'
v3="${n}"
echo "${v1}"
echo "${v2}"
echo "${v3}"
可以从结果看出不加引号和加双引号的结果是相同的,而单引号是原样输出变量后面赋值的内容。
b、shell变量的修改、删除:
#!/bin/bash
#变量值的修改
a=1
echo "a: ${a}"
a=2
echo "a: ${a}"
#只读变量是不可以修改的,在变量前加readonly,就是只读变量
c=1
echo "c: ${c}"
readonly c
c=2
echo "c: ${c}"
#只要在变量前面加一个 unset,如: unset a 就可以删除变量。
unset a
echo "a: ${a}"
$0 | 当前脚本的文件名或者解释器。 |
$n(n≥1) | 传递给脚本或函数的参数。n 是一个数字,表示第几个参数。例如,第一个参数是 $1,第二个参数是 $2。 |
$# | 传递给脚本或函数的参数个数。 |
$* | 传递给脚本或函数的所有参数。 |
$@ | 传递给脚本或函数的所有参数。当被双引号" " 包含时,$@ 与 $* 稍有不同,$*的所有参数是一个数据,而$@一个参数就是一份数据 |
$? | 上个命令的退出状态,或函数的返回值 |
$$ | 当前 Shell 进程 ID。对于 Shell 脚本,就是这些脚本所在的进程 ID。 |
脚本:如果参数个数太多,达到或者超过了 10 个,那么就得用${n}
的形式来接收了,例如 ${10}、${11}
#!/bin/bash
#shell特殊变量
#$n: $0表示本脚本,$1表示输入的第一个参数:11,$2表示输入的第一个参数:22
echo "$ 0: $0"
echo "a: $1"
echo "b: $2"
#$*: 输入的参数 11 22
echo "$ *: $*"
#$@: 输入的参数 11 22
echo "$ @: $@"
#$$: shell进程id
echo "$ $: $$"
#$#: 参数个数 2
echo "$ #: $#"
函数:如果参数个数太多,达到或者超过了 10 个,那么就得用${n}
的形式来接收了,例如 ${10}、${11}
#!/bin/bash
#shell特殊变量
#$n: $0表示本脚本,$1表示输入的第一个参数:11,$2表示输入的第一个参数:22
function temp(){
echo "$ 0: $0"
echo "a: $1"
echo "b: $2"
#$*: 输入的参数 11 22
echo "$ *: $*"
#$@: 输入的参数 11 22
echo "$ @: $@"
#$$: shell进程id
echo "$ $: $$"
#$#: 参数个数 2
echo "$ #: $#"
}
temp 11 12
$?:上一个命令的退出状态,或者返回值:
#!/bin/bash
if [ $1 == 11 ]
then
return 0
else
return 1
fi
$?在shell函数中的应用:
#!/bin/bash
function temp(){
return $1
}
temp 3
#$?: 这里是函数的返回值
echo "$ ?: $?"
#!/bin/bash
#shell字符串的拼接
n1=ab
n2=cd
temp1=${n1}${n2} #中间不能有空格
temp2="${n1}${n2}"
temp3="${n1}cdefg"
echo "${temp1}"
echo "${temp2}"
echo "${temp3}"
#!/bin/bash
#shell截取字符串
str=http//:baidu.com/.c
echo "length: ${str:7:5}" # baidu
echo "no length: ${str:7}" # baidu.com/.c
echo "length: ${str:0-7:5}" # .com/
echo "no length: ${str:0-7}" # .com/.c
echo "#: ${str#*/}" # /:baidu.com/.c
echo "##: ${str##*/}" # .c
echo "%: ${str%/*}" # http//:baidu.com
echo "%%: ${str%%/*}" # http
bash shell 中只支持一维,而不支持二维,定义的形式:array=(n1 n2 n3) ,数组名等号两边不能有空格,数组变量的值用空格隔开表示不同的值,一个数组变量的值可以用数字或者字符串不同的形式组成:array=(1 2 ab) 。
Shell 数组的长度不是固定的,定义之后还可以增加元素,如:array[3]=cd ;就在最后增加了一个元素。
也不用逐个赋值;如:array=([2]=ab);但他的长度是1
调用数组:
#!/bin/bash
#shell中的数组
array=( 1 2 ab)
n=${array} #array中的第一个元素赋值给n
echo "array[0]: ${array[0]}"
echo "array[*]: ${array[*]}"
echo "n[*]: ${n[*]}"
array[5]=cd
echo "array[5]: ${array[5]}"
echo "array[@]: ${array[@]}"
获取shell数组的元素个数或者shell数组里字符串的长度:${#array[*]}、${#array[@]}、${#array[4]}
#!/bin/bash
#shell中的数组
array=( 1 2 abc)
echo "#array[*] ${#array[*]}"
array[4]=12345
echo "#array[@] ${#array[*]}" #这边多加了一个元素就是4
echo "#array[4] ${#array[4]}" #这边是计算array[4]中字符串的长度
数组的拼接:利用${array[*]}、${array[@]}:
#!/bin/bash
#shell中的数组的拼接
array1=( 1 2 abc)
array2=(cd ef)
array3=(${array1[@]} ${array2[@]})
echo "array3: ${array3[@]}"
echo "array3 length: ${#array3[@]}"
shell数组元素的删除:unset
#!/bin/bash
#shell中的数组
array1=(1 2 abc)
array2=(1 2 abc)
unset array1[2] #删除array1数组中的一个元素abc
echo "array1[*]: ${array1[*]}"
unset array2 #删除整个数组array2
echo "array2[*]: ${array2[*]}"
a)、if单分支:
-eq 等于,如:if [ "$a" -eq "$b" ]
-ne 不等于,如:if [ "$a" -ne "$b" ]
-gt 大于,如:if [ "$a" -gt "$b" ]
-ge 大于等于,如:if [ "$a" -ge "$b" ]
-lt 小于,如:if [ "$a" -lt "$b" ]
-le 小于等于,如:if [ "$a" -le "$b" ]
#!/bin/bash
#shell中if:
#if单分支第一中形式:if []
if [ 1 -eq 1 ] #[]里面的数据和中括号必须一个空格
then
echo "first if:真"
fi
#if单分支第二中形式:if []; then
if [ 1 -eq 1 ]; then #then和if写在同一行必须要用;
echo "second if:真"
fi
#if单分支第三中形式:if (())
if ((1==1))
then
echo "third if:真"
fi
b、双分支if:
#!/bin/bash
#shell中if:
#if双分支
if ((1==0)) #判断1和o是不是相等
then
echo "我是真的"
else
echo "我是假的"
fi
#................................
if [ 1 -eq 0 ] #判断1和o是不是相等,
then
echo "我是真的"
else
echo "我是假的"
fi
3、iif多分支:
#!/bin/bash
#shell中if:
#if多分支
if ((1==0)) #判断1和o是不是相等
then
echo "1=0;是真的"
elif ((1>0))
then
echo "1>0;是真的"
else
echo "1>0;是假的"
fi
#..............................
if [ 1 -eq 0 ] #判断1和o是不是相等
then
echo "1=0;是真的"
elif [ 1 -gt 0 ]
then
echo "1>0;是真的"
else
echo "1>0;是假的"
fi
#!/bin/bash
#shell中的case
read VAILE #在屏幕中输入一个数,1或者2,如果不是这两个数就代表其他;即 *),
case ${VAILE} in
"1")
echo "我是1"
;;
"2")
echo "我是2"
;;
*)
echo "我不是1,也不是2"
;;
esac
a)、for循环形式1:
#!/bin/bash
#shell中的 for
for n in 1 3 5 #n是我们自定义的变量,in后面三个数就是循环3次,每次的值从第一个数的值开始
do
echo "我是n,我的值是:${n}"
done
b)、for循环形式2:与c语言的形式类似
#!/bin/bash
#shell中的 for
for ((n=0;n<3;n++))
do
echo "我是n,我的值是:${n}"
done
#!/bin/bash
#shell中的 while
n=0
while [ ${n} -lt 2 ] #n<2;就循环,否则退出循环
do
n=$((${n}+1))
echo "我是n,我的值是:${n}"
done
echo "我退出循环了"
#!/bin/bash
#shell中的 until
n=-2
until ((n>1)) #不满足条件就循环,满足条件则退出循环
do
n=$((${n}+1))
echo "我是n,我的值是:${n}"
done
echo "我退出循环了"
#!/bin/bash
#shell中的 break/continue
n=0
while ((n<6)) #n<6;就循环,否则退出循环
do
n=$((${n}+1))
if ((n==2))
then
echo "我应该打印2,但我continue了"
continue
fi
if ((n==5))
then
echo "n循环6次,应该等于6,但我break了,我现在的值是:${n}"
break
fi
echo "我是n,我的值是:${n}"
done
echo "我退出循环了"
function 函数名(){
..........
}
#!/bin/bash
#shell中的函数
function fun(){
if(($1 > 1)); then
echo "条件成立"
fi
if(($2 > 1)); then
echo "条件成立"
else
echo "条件不成立"
fi
}
fun 2 1 #这边传参数给fun()函数
文章浏览阅读7.7k次,点赞2次,收藏10次。题目:去掉列表中重复的元素分析:给定一个列表,怎么将其中重复的元素删除呢?1.只用循环的方法:思路:先从该列表中拿出第一个数(下标为0),再拿出第二个数(下标为1),进行比较,如果值相等,则把第二个数删掉。再拿出第三个数(下标为2),与第一个数比较,如果不相等,则继续取元素。以此类推: #coding:utf-8 li = [1,2,3,4,5,2,1,3,4,57,8,8,9]_第4关:列表中的重复元素 1
文章浏览阅读82次。物联网(IoT),智能硬件热火朝天, 真正解决了用户的痛点和行业痛点了吗?还是链接而链接智能而智能?就如下图:你会想要一个物联网的咖啡杯吗?不会吧!物联网(IoT)话题正热,它是时下最流行的趋势。你可能会认为世界上没有什么产品不需要以物联网来实现。然而,只因为有些事完成了,并不表示就应该这么做。当然,物联网的潜在价值主张是相当庞大的,它能够带动新公司...
文章浏览阅读873次。在表格A列上填写数字,数字顺序要从大到小填写进去 ,然后再输入公式=”按文件名称归类<>将文件名称:[{包含}]关键字:[{“&A1&”}]的文件移动到目标文件夹:[{F:\A\新建文件夹_”&A1&”}],执行前不删除原目标文件夹中的文件”。先来给大家看下目前文件是这样的,一个文件夹里面保存是图片 ,另一个文件夹保存是文档,我是需要一个图片对应一个文档,保存在同一个文件夹中。步骤5选下任务名称:按文件名称归类,将文件名称包含“41”文件“移动”目标文件夹:选择路径,再点添加本任务。_文件批量归类
文章浏览阅读221次。Raft协议_raft协议
文章浏览阅读10w+次,点赞25次,收藏277次。程序员编程艺术:第三章、寻找最小的k个数作者:July。时间:二零一一年四月二十八日。致谢:litaoye, strugglever,yansha,luuillu,Sorehead,及狂想曲创作组。微博:http://weibo.com/julyweibo。出处:http://blog.csdn.net/v_JULY_v。----------------------------------前奏_e:t∵n“?。‘:1;。::1f
文章浏览阅读161次。自己动手写个聊天机器人吧_聊天机器人 开源
文章浏览阅读9k次,点赞17次,收藏24次。Java设计模式的学习与实践对于提升软件开发水平具有重要意义。理解并熟练运用这些模式,可以帮助开发者编写出更易于维护、扩展、复用的高质量代码。然而,设计模式并非银弹,关键在于合理选择、适时运用。在实际项目中,应结合具体业务需求、技术栈特点及团队开发规范,权衡利弊,避免过度设计。持续探索、实践与反思,方能真正领略设计模式的魅力,成为更优秀的Java开发者。
文章浏览阅读14次。主营业务 Main Business;主营业务 Main Business;主营业务 Main Business;勒纳 Lerner;勒纳 Lerner;勒纳 Lerner;
文章浏览阅读225次。本系列主要参考《Unity Shaders and Effects Cookbook》一书(感谢原书作者),同时会加上一点个人理解或拓展。这里是本书所有的插图。这里是本书所需的代码和资源(当然你也可以从官网下载)。========================================== 分割线============================..._unity 怎么动态换cubemap
文章浏览阅读1.3k次,点赞2次,收藏8次。实验目的熟悉并掌握创建表,插入记录,查询记录,删除记录,修改记录。创建索引,删除索引。创建视图,使用视图,删除视图。实验内容仍然基于上次课程建立的小型图书借阅系统。如果使用实验室的机器完成实验,首先重做上次课的步骤1-4建立相应数据库。实验步骤(以用户CC的身份建立连接,并在此连接下执行后面的操作。)1、 查询记录:在Reader表中查询直接上司是“李四”的员工的名字SELECT rname from reader where rboss=’李四’;2、 修改记录:在Reader_当修改reader表元组的rno时,级联修改loan表中该读者的借阅记录。 (2)当删除reader
文章浏览阅读515次。java毕业设计校园闲置物品交易平台mybatis+源码+调试部署+系统+数据库+lw。springboot基于SSM框架的项目实训管理系统设计与实现。springboot基于JSP的企业办公管理系统设计与实现。ssm+sqlserver海城同泽中学图书仓库管理系统。ssm基于Web的医学院校大学生就业信息管理系统。ssm+sqlserver精品旅游项目管理系统。ssm基于HTML的寿光农产品的资源展示平台。ssm基于Java的摄影网上预约管理系统。ssm基于JavaWeb的好好吃查询系统。
文章浏览阅读368次。在C++ 中新增了一个字符串类型 string。比较与C语言只能用字符数组来表达字符串,大大提高了字符串操作的简便性。而且string也比较常用,但是对于不熟悉的人来说它的很多功能我们都不了解。我是想写写自己对使用string的一些感悟的,无奈下面这篇博客太优秀。有一定C++基础更能理解作者所写。转自:https://www.cnblogs.com/lifexy/p/8642163....