转变成可执行文件
chmod +x hello_script.sh
输出重定向
echo "hello" > log.txt //将字符串hello输出到文件log.txt中:
echo "world" > log.txt //将里原本数据清除,执行1,2代码只显示world
echo "hello" >> log.txt //可以追加到下一行
ls > 1.txt //将查找到的内容写入文件,
ls >>1.txt //可以追加,多行显示
变量定义
定义变量
- variable 是变量名,value 是赋给变量的值。如果 value 不包含任何空白符(例如空格、Tab 缩进等),那么可以不使用引号;如果 value 包含了空白符,那么就必须使用引号包围起来。
- 注意,赋值号=的周围不能有空格,这可能和你熟悉的大部分编程语言都不一样。
variable=value
variable='value'
variable="value"
##使用变量
author="严长生"
echo $author
echo ${author}
单引号双引号区别
- 以单引号’ '包围变量的值时,单引号里面是什么就输出什么,即使内容中有变量和命令(命令需要反引起来)也会把它们原样输出。
- 以双引号" "包围变量的值时,输出时会先解析里面的变量和命令,而不是把双引号中的变量名和命令原样输出。这种方式比较适合字符串中附带有变量和命令并且想将其解析后再输出的变量定义。
url="http://c.biancheng.net"
website1='C语言中文网:${url}'
website2="C语言中文网:${url}"
echo $website1
echo $website2
运行结果:
C语言中文网:${url}
C语言中文网:http://c.biancheng.net
执行命令
第一种方式把命令用反引号
(位于 Esc 键的下方)包围起来,反引号和单引号非常相似,容易产生混淆,所以不推荐使用这种方式;第二种方式把命令用$()包围起来,区分更加明显,所以推荐使用这种方式。
variable=`command`
variable=$(command)
数组
数组定义法1:
arr=(1 2 3 4 5) # 注意是用空格分开,不是逗号!!
数组定义法2:
array
array[0]="a"
array[1]="b"
array[2]="c"
获取数组的length(数组中有几个元素):
${#array[@]}
遍历(For循环法):
for var in ${arr[@]};
do
echo $var
done
遍历(带数组下标):
for i in "${!arr[@]}";
do
printf "%s\t%s\n" "$i" "${arr[$i]}"
done
遍历(While循环法):
i=0
while [ $i -lt ${#array[@]} ]
do
echo ${ array[$i] }
let i++
done
向函数传递数组:
由于Shell对数组的支持并不号,所以这是一个比较麻烦的问题。
翻看了很多StackOverFlow的帖子,除了全局变量外,无完美解法。
这里提供一个变通的思路,我们可以在调用函数前,将数组转化为字符串。
在函数中,读取字符串,并且分为数组,达到目的。
fun() {
local _arr=(`echo $1 | cut -d " " --output-delimiter=" " -f 1-`)
local _n_arr=${#_arr[@]}
for((i=0;i<$_n_arr;i++));
do
elem=${_arr[$i]}
echo "$i : $elem"
done;
}
array=(a b c)
fun "$(echo ${array[@]})"
通配符
ls ~/shell|grep sh$ 表示sh结尾的文件
查找文件夹下带.cpp的文件
file_list=`find ${path}|grep -E ".*\.cpp$"`
for file in ${file_list}
do echo ${file}
done
*
ls *.c //显示文件为.c后缀全部文件
ls file*.c //显示显示以file开头的所有.c的文件
?
ls file? //结果file1,file2...
ls file?? //结果file12,file13....
ls file??? //结果file123,124...
[ - ] 匹配给定范围的第一个字符,- 代表一个范围
[a-z] //代表一个小写字母,
[A-Z] //代表一个大写字母
[0-9] //代表一个的数字
[ ^ ] 或[ ! ] 匹配除了这个字符其他的字符。不是这个中括号内的字符
[^0-9] //代表除了数字的其他的
{ .. } 生成序列
touch file{1..5}.c //生成file1.c 到file10.c的文件
注意事项
sudo chmod +x play.sh ##使命令生效
sh和bash是不同版本的,实在不行可以试一下bash play.sh
字符串拼接
#!/bin/bash
name="Shell"
url="http://c.biancheng.net/shell/"
str1=$name$url #中间不能有空格
str2="$name $url" #如果被双引号包围,那么中间可以有空格
str3=$name": "$url #中间可以出现别的字符串
str4="$name: $url" #这样写也可以
str5="${name}Script: ${url}index.html" #这个时候需要给变量名加上大括号
实例
1.字符串播包
data_bag[0]=/home/hj/data/data_dir0/
data_bag[1]=/home/hj/data/data_dir1/
echo ${data_bag[0]'/'${ls ${data_bag}|grep dbag$}}
sudo chmod +x play.sh
2.文件夹批量操作
#!/bin/bash
cur_dir=$(pwd)
top_dir=$(dirname $(pwd))
exe_file=${top_dir}/build/auto_sub_module
config_all=`ls ${cur_dir}/config`
analysis_path=${cur_dir}/analysis
config_path=${cur_dir}/config
for config_file in ${config_all}
do
if [ ${config_file#*.} = json ];then
config_path_file=${config_path}/${config_file}
analysis_file=${config_file/config/analysis}
analysis_path_file=${analysis_path}/${analysis_file}
${exe_file} ${config_path_file} ${analysis_path_file}
fi
done
3.shell获取当前文件的绝对目录和上一级目录
cur_path=$(cd "$(dirname "$0")";pwd)//文件当前的位置
top_path=$(dirname $(cd $(dirname $0);pwd)) //文件的上一级目录
操作命名连续的内容
touch file{1..5}.c
参考网址
shell脚本传参数
#!/bin/bash
#定义函数
function func(){
echo "Language: $1"
echo "URL: $2"
}
#调用函数
func $1 $2
终端常规操作
常用
ctrl+左右键 : 在单词之间跳转
ctrl+a : 跳到本行的行首
ctrl+e : 跳到页尾
Ctrl+u :删除当前光标前面的文字 (还有剪切功能)
ctrl+k :删除当前光标后面的文字(还有剪切功能)
Ctrl+L:进行清屏操作
Ctrl+y : 粘贴Ctrl+u或ctrl+k剪切的内容
Ctrl+w : 删除光标前面的单词的字符(以空格隔开的字符串)
Alt – d :由光标位置开始,往右删除单词,往行尾删
Ctrl+r : 搜索执行过的命令
! + 最近执行过的命令中的某个字符 :可快速执行最近执行过的命令
fs -l :显示部分历史命令
说明
Ctrl – k: 先按住 Ctrl 键,然后再按 k 键;
Alt – k: 先按住 Alt 键,然后再按 k 键;
M – k:先单击 Esc 键,然后再按 k 键。
移动光标
Ctrl – a :移到行首
Ctrl – e :移到行尾
Ctrl – b :往回(左)移动一个字符
Ctrl – f :往后(右)移动一个字符
Alt – b :往回(左)移动一个单词
Alt – f :往后(右)移动一个单词
Ctrl – xx :在命令行尾和光标之间移动
M-b :往回(左)移动一个单词
M-f :往后(右)移动一个单词
编辑命令
Ctrl – h :删除光标左方位置的字符
Ctrl – d :删除光标右方位置的字符(注意:当前命令行没有任何字符时,会注销系统或结束终端)
Ctrl – w :由光标位置开始,往左删除单词。往行首删
Alt – d :由光标位置开始,往右删除单词。往行尾删
M – d :由光标位置开始,删除单词,直到该单词结束。
Ctrl – k :由光标所在位置开始,删除右方所有的字符,直到该行结束。
Ctrl – u :由光标所在位置开始,删除左方所有的字符,直到该行开始。
Ctrl – y :粘贴之前删除的内容到光标后。
ctrl – t :交换光标处和之前两个字符的位置。
Alt + . :使用上一条命令的最后一个参数。
Ctrl – _ :回复之前的状态。撤销操作。
移动光标编辑命令
Ctrl -a + Ctrl -k
Ctrl -e + Ctrl -u
Ctrl -k + Ctrl -u
组合可删除整行。
Bang(!)命令
!! :执行上一条命令。
foobar :把上一条命令里的foo替换为bar,并执行。
!wget :执行最近的以wget开头的命令。
!wget:p :仅打印最近的以wget开头的命令,不执行。
!_` 相同。
!* :上一条命令的所有参数
!*:p :打印上一条命令是所有参数,也即 !*的内容。
^abc :删除上一条命令中的abc。
foobar :将上一条命令中的 foo 替换为 bar
foobar^ :将上一条命令中的 foo 替换为 bar
!-n :执行前n条命令,执行上一条命令: !-1, 执行前5条命令的格式是: !-5
查找历史命令
Ctrl – p :显示当前命令的上一条历史命令
Ctrl – n :显示当前命令的下一条历史命令
Ctrl – r :搜索历史命令,随着输入会显示历史命令中的一条匹配命令,Enter键执行匹配命令;ESC键在命令行显示而不执行匹配命令。
Ctrl – g :从历史搜索模式(Ctrl – r)退出。
控制命令
Ctrl – l :清除屏幕,然后,在最上面重新显示目前光标所在的这一行的内容。
Ctrl – o :执行当前命令,并选择上一条命令。
Ctrl – s :阻止屏幕输出
Ctrl – q :允许屏幕输出
Ctrl – c :终止命令
Ctrl – z :挂起命令
重复执行操作动作
M – 操作次数 操作动作 : 指定操作次数,重复执行指定的操作。
ubuntu建立软链接
cd / //先到根目录下
sudo ln -s ~/catkin_ws/src/vins/ipa_locator /建立软链接,会在根目录下生成链接
sudo chown -R dji:dji ipa_locator 赋予修改的权限
ll -alth ipa_locator
使用脚本播包
data_bag[0]=/home/hj/data/data_dir0/
data_bag[1]=/home/hj/data/data_dir1/
echo ${data_bag[0]'/'${ls $(data_bag}|grep dbagx$})
sudo chmod +x play.sh
快捷键
Tab 自动补全
Ctrl+a 光标移动到开始位置
Ctrl+e 光标移动到最末尾
Ctrl+k 删除此处至末尾的所有内容
Ctrl+u 删除此处至开始的所有内容
Ctrl+d 删除当前字符
Ctrl+h 删除当前字符前一个字符
Ctrl+w 删除此处到左边的单词
Ctrl+y 粘贴由Ctrl+u, Ctrl+d, Ctrl+w删除的单词
Ctrl+l 相当于clear,即清屏
Ctrl+r 查找历史命令
Ctrl+b 向回移动光标
Ctrl+f 向前移动光标
Ctrl+t 将光标位置的字符和前一个字符进行位置交换
Ctrl+& 恢复 ctrl+h 或者 ctrl+d 或者 ctrl+w 删除的内容
Ctrl+S 暂停屏幕输出
Ctrl+Q 继续屏幕输出
Ctrl+p 向上显示缓存命令
Ctrl+n 向下显示缓存命令
Ctrl+d 关闭终端
Ctrl+xx 在EOL和当前光标位置移动
Ctrl+x@ 显示可能hostname补全
Ctrl+c 终止进程/命令
Shift+上或下 终端上下滚动
Shift+PgUp/PgDn 终端上下翻页滚动
Ctrl+Shift+n 新终端
alt+F2 输入gnome-terminal打开终端
Shift+Ctrl+T 打开新的标签页
Shift+Ctrl+W 关闭标签页
Shift+Ctrl+C 复制
Shift+Ctrl+V 粘贴
Alt+数字 切换至对应的标签页
Shift+Ctrl+N 打开新的终端窗口
Shift+Ctrl+Q 管壁终端窗口
F1 打开帮助指南
F10 激活菜单栏
F11 全屏切换
Alt+F 打开 “文件” 菜单(file)
Alt+E 打开 “编辑” 菜单(edit)
Alt+V 打开 “查看” 菜单(view)
Alt+S 打开 “搜索” 菜单(search)
Ctrl+Left-Arrow 光标移动到上一个单词的词首
Ctrl+Right-Arrow 光标移动到下一个单词的词尾
Alt+T 打开 “终端” 菜单(terminal)
Alt+H 打开 “帮助” 菜单(help)
Shift+Ctrl+PgUp/PgDn 左移右移标签页
Ctrl+PgUp/PgDn 切换标签页
CTRL + ALT + T: 打开终端
TAB: 自动补全命令或文件名
CTRL + SHIFT + V: 粘贴(Linux中不需要复制的动作,文本被选择就自动被复制)
CTRL + SHIFT + T: 新建标签页
CTRL + D: 关闭标签页
CTRL + L: 清楚屏幕
CTRL + R + 文本: 在输入历史中搜索
CTRL + A: 移动到行首
CTRL + E: 移动到行末
CTRL + C: 终止当前任务
CTRL + Z: 把当前任务放到后台运行(相当于运行命令时后面加&)
等待时长后执行
sleep 1600; ./start_hhh //sleep 1600s后执行
后台执行进程
sensetime_log >/dev/null 2>&1