一.shell 

  shell是操作系统与用户之间的沟通的渠道,可以接收并执行用户的命令,有很多shell程序,目前linux默认使用bash shell程序。

  bash shell有很多实用功能,例如:

  • 命令记忆
  • 命令补全

    [TAB][TAB]:列出所有命令

  *[TAB][TAB]:列出所有以字符*开头的命令

  *[TAB]:列出当前目录以字符*开头的命令

  • 后台运行,&,可以不受CTRL+C影响,且单一登录环境中达到多任务目的
  • 程序脚本,功能强大

  二.变量

  跟C语言里的变量意义差不多。

  三.变量的显示与设置echo,=,unset

  1. 显示变量: echo  $变量

liuwanpeng@ubuntu:/etc$ echo $PATH
/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:/work/setup/lin/bin:/work/setup/gcc-linaro-arm-linux-gnueabihf-4.8-.12_linux/bin
liuwanpeng@ubuntu:/etc$ echo ${PATH}
/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:/work/setup/lin/bin:/work/setup/gcc-linaro-arm-linux-gnueabihf-4.8-.12_linux/bin

  2. 设置变量, =, 定义与赋值合一了

liuwanpeng@ubuntu:~$ myvar=test_variable
liuwanpeng@ubuntu:~$ echo $myvar
test_variable
liuwanpeng@ubuntu:~$ myvar="test_variable"
liuwanpeng@ubuntu:~$ echo $myvar
test_variable (1). 空格,两边不能直接接空格符,右侧需要用双引号或者单引号扩起来
liuwanpeng@ubuntu:~$ myvar=test variable  // 错误,不能有空格,bash会认为空格后面的variable是个命令
variable: command not found
liuwanpeng@ubuntu:~$ myvar="test variable"
liuwanpeng@ubuntu:~$ echo $myvar
test variable
liuwanpeng@ubuntu:~$ var ="lang is $LANG" // 等号左边也不能有空格
No command 'var' found, but there are 22 similar ones
var: command not found (2) 单引号和双引号
liuwanpeng@ubuntu:~$ var="lang is $LANG"  // 双引号内的特殊字符,如$还其特殊字符的作用
liuwanpeng@ubuntu:~$ echo $var
lang is en_US.UTF-8
liuwanpeng@ubuntu:~$ var='lang is $LANG' // 单引号内的特殊字符变为普通字符,没有特殊作用了
liuwanpeng@ubuntu:~$ echo $var
lang is $LANG (3) 转意字符可把特殊字符变为普通字符
liuwanpeng@ubuntu:~$ var="lang is \$LANG"
liuwanpeng@ubuntu:~$ echo $var
lang is $LANG (4) 获取其他命令提供的信息, $(命令) 或 `命令`,注意是反引号,数字键1旁边的那个
liuwanpeng@ubuntu:~$ var=$(uname -r)
liuwanpeng@ubuntu:~$ echo $var
4.2.0-27-generic
liuwanpeng@ubuntu:~$ var=`uname -r`
liuwanpeng@ubuntu:~$ echo $var
4.2.0-27-generic (5) 变量的累加
liuwanpeng@ubuntu:~$ echo $PATH
/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:/work/setup/lin/bin:/work/setup/gcc-linaro-arm-linux-gnueabihf-4.8-2013.12_linux/bin
liuwanpeng@ubuntu:~$ PATH="$PATH":/home
liuwanpeng@ubuntu:~$ echo $PATH
/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:/work/setup/lin/bin:/work/setup/gcc-linaro-arm-linux-gnueabihf-4.8-2013.12_linux/bin:/home

  注意:

变量名只能是英文+数字,且只能英文开头;

    若变量需要在其他子进程使用,需要使用export使其具有环境变量的作用。

通常大写字符是系统默认变量,小写字符是用户自定义变量

  3. 撤销变量unset

liuwanpeng@ubuntu:~$ echo $var
4.2.--generic
liuwanpeng@ubuntu:~$ unset var
liuwanpeng@ubuntu:~$ echo $var

 

 四.环境变量

env:查看环境变量

set:查看所有变量(环境变量+用户变量)

liuwanpeng@ubuntu:~$ env
XDG_VTNR=
XDG_SESSION_ID=c2
CLUTTER_IM_MODULE=xim
SELINUX_INIT=YES
XDG_GREETER_DATA_DIR=/var/lib/lightdm-data/liuwanpeng
SESSION=ubuntu
GPG_AGENT_INFO=/run/user//keyring-UUS4MO/gpg::
TERM=xterm
SHELL=/bin/bash
XDG_MENU_PREFIX=gnome-
VTE_VERSION=
WINDOWID=
OLDPWD=/home/liuwanpeng
UPSTART_SESSION=unix:abstract=/com/ubuntu/upstart-session//
GNOME_KEYRING_CONTROL=/run/user//keyring-UUS4MO
GTK_MODULES=overlay-scrollbar:unity-gtk-module
USER=liuwanpeng
LS_COLORS=rs=:di=;:ln=;:mh=:pi=;:so=;:do=;:bd=;;:cd=;;:or=;;:su=;:sg=;:ca=;:tw=;:ow=;:st=;:ex=;:*.tar=;:*.tgz=;:*.arj=;:*.taz=;:*.lzh=;:*.lzma=;:*.tlz=;:*.txz=;:*.zip=;:*.z=;:*.Z=;:*.dz=;:*.gz=;:*.lz=;:*.xz=;:*.bz2=;:*.bz=;:*.tbz=;:*.tbz2=;:*.tz=;:*.deb=;:*.rpm=;:*.jar=;:*.war=;:*.ear=;:*.sar=;:*.rar=;:*.ace=;:*.zoo=;:*.cpio=;:*.7z=;:*.rz=;:*.jpg=;:*.jpeg=;:*.gif=;:*.bmp=;:*.pbm=;:*.pgm=;:*.ppm=;:*.tga=;:*.xbm=;:*.xpm=;:*.tif=;:*.tiff=;:*.png=;:*.svg=;:*.svgz=;:*.mng=;:*.pcx=;:*.mov=;:*.mpg=;:*.mpeg=;:*.m2v=;:*.mkv=;:*.webm=;:*.ogm=;:*.mp4=;:*.m4v=;:*.mp4v=;:*.vob=;:*.qt=;:*.nuv=;:*.wmv=;:*.asf=;:*.rm=;:*.rmvb=;:*.flc=;:*.avi=;:*.fli=;:*.flv=;:*.gl=;:*.dl=;:*.xcf=;:*.xwd=;:*.yuv=;:*.cgm=;:*.emf=;:*.axv=;:*.anx=;:*.ogv=;:*.ogx=;:*.aac=;:*.au=;:*.flac=;:*.mid=;:*.midi=;:*.mka=;:*.mp3=;:*.mpc=;:*.ogg=;:*.ra=;:*.wav=;:*.axa=;:*.oga=;:*.spx=;:*.xspf=;:
XDG_SESSION_PATH=/org/freedesktop/DisplayManager/Session0
XDG_SEAT_PATH=/org/freedesktop/DisplayManager/Seat0
SSH_AUTH_SOCK=/run/user//keyring-UUS4MO/ssh
SESSION_MANAGER=local/ubuntu:@/tmp/.ICE-unix/,unix/ubuntu:/tmp/.ICE-unix/
DEFAULTS_PATH=/usr/share/gconf/ubuntu.default.path
XDG_CONFIG_DIRS=/etc/xdg/xdg-ubuntu:/usr/share/upstart/xdg:/etc/xdg
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:/work/setup/lin/bin:/work/setup/gcc-linaro-arm-linux-gnueabihf-4.8-.12_linux/bin:/home
DESKTOP_SESSION=ubuntu
QT_IM_MODULE=ibus
QT_QPA_PLATFORMTHEME=appmenu-qt5
JOB=dbus
PWD=/home/liuwanpeng
XMODIFIERS=@im=ibus
GNOME_KEYRING_PID==en_US.UTF-
GDM_LANG=en_US
MANDATORY_PATH=/usr/share/gconf/ubuntu.mandatory.path
IM_CONFIG_PHASE=
COMPIZ_CONFIG_PROFILE=ubuntu
GDMSESSION=ubuntu
SESSIONTYPE=gnome-session
XDG_SEAT=seat0
HOME=/home/liuwanpeng
SHLVL=
LANGUAGE=en_US
GNOME_DESKTOP_SESSION_ID=this-is-deprecated
LOGNAME=liuwanpeng
COMPIZ_BIN_PATH=/usr/bin/
XDG_DATA_DIRS=/usr/share/ubuntu:/usr/share/gnome:/usr/local/share/:/usr/share/
QT4_IM_MODULE=xim
DBUS_SESSION_BUS_ADDRESS=unix:abstract=/tmp/dbus-mtBR2W2AvW
LESSOPEN=| /usr/bin/lesspipe %s
INSTANCE=
TEXTDOMAIN=im-config
XDG_RUNTIME_DIR=/run/user/
DISPLAY=:
XDG_CURRENT_DESKTOP=Unity
GTK_IM_MODULE=ibus
LESSCLOSE=/usr/bin/lesspipe %s %s
TEXTDOMAINDIR=/usr/share/locale/
COLORTERM=gnome-terminal
XAUTHORITY=/home/liuwanpeng/.Xauthority
_=/usr/bin/env

  1.重要的变量

(1). PS1设置命令提示符的格式

PS1='\[\e]0;\u@\h: \w\a\]${debian_chroot:+($debian_chroot)}\u@\h:\w\$ '

可以修改 /etc/profile,改变PS1的默认值

(2). 本shell的PID:$

liuwanpeng@ubuntu:~$ echo $$

(3).上一个执行命令的回传码?,即执行结果,一般0是正确,其他至是错误

liuwanpeng@ubuntu:~$ ls /no_dir
ls: cannot access /no_dir: No such file or directory
liuwanpeng@ubuntu:~$ echo $? liuwanpeng@ubuntu:~$ ls
liuwanpeng@ubuntu:~$ echo $?

2.环境变量与自定义变量/变量的有效范围

(1).子进程只继承父进程的环境变量,不能继承自定义变量,如果想让父进程的自定义变量可以在子进程里使用,需要用export导出该变量

(2).环境变量~全局变量;自定义变量~局部变量

五. 变量键盘输入 read

-p:后接提示信息

-t: 超时时间

liuwanpeng@ubuntu:~$ read var
input val from keyboard
liuwanpeng@ubuntu:~$ echo $var
input val from keyboard liuwanpeng@ubuntu:~$ read -p "input value:" -t var
input value:my input
liuwanpeng@ubuntu:~$ echo $var
my input

六. 声明变量的类型 declare/typedset

如果不带参数,会显示所有命令,跟set差不多。

declare [-aixr]  variable
参数:
-a:将variable的变量定义为数组,array
-i:整型
-x:与export一样
-r:readonly,只读 1. -i,shell默认是字符串,1+2+3不是6,而是字符串“1+2+3”
liuwanpeng@ubuntu:~$ sum=1+2+3
liuwanpeng@ubuntu:~$ echo $sum
1+2+3
liuwanpeng@ubuntu:~$ declare -i sum=1+2+3
liuwanpeng@ubuntu:~$ echo $sum
6 2. -x和-r
liuwanpeng@ubuntu:~$ declare -x sum    // export
liuwanpeng@ubuntu:~$ export | grep sum  // export命令列出所有带-x的变量,sum带有x属性
declare -ix sum="6"             
liuwanpeng@ubuntu:~$ declare +x sum    // +号的意思是“取消”
liuwanpeng@ubuntu:~$ export | grep sum  // 没有了
liuwanpeng@ubuntu:~$ declare -p sum // -p单独列出变脸的类型
declare -i sum="6"
liuwanpeng@ubuntu:~$ declare -r sum
liuwanpeng@ubuntu:~$ sum=10
bash: sum: readonly variable

七. 数组类型array,shell支持一维数组

liuwanpeng@ubuntu:~$ array[]=
liuwanpeng@ubuntu:~$ array[]=
liuwanpeng@ubuntu:~$ echo ${array[]}    // 只有此种形式显示才正常!!! ${}

八.变量内容的删除,替代和替换

1. 删除部分字符

${变量#关键字} 从左往右,按符合关键字的最短字符处理
${变量##关键字} 从左往右,按符合关键字的最长字符处理
${变量%关键字} 从右往左,按符合关键字的最短字符处理
${变量%%关键字} 从右往左,按符合关键字的最长字符处理
liuwanpeng@ubuntu:~$ echo ${PATH}
/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games
liuwanpeng@ubuntu:~$ echo ${PATH#/*sbin:}
/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games liuwanpeng@ubuntu:~$ echo ${PATH##/*sbin:}
/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/game liuwanpeng@ubuntu:~$ echo ${PATH%sbin}
/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games liuwanpeng@ubuntu:~$ echo ${PATH%%sbin}
/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games

2. 替代部分字符

${变量/旧字符/新字符} 第一个被替换
${变量//旧字符/新字符} 所有都被替换
liuwanpeng@ubuntu:~$ echo ${PATH/sbin/SBIN}
/usr/local/SBIN:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:/work/setup/lin/bin
liuwanpeng@ubuntu:~$ echo ${PATH//sbin/SBIN}
/usr/local/SBIN:/usr/local/bin:/usr/SBIN:/usr/bin:/SBIN:/bin:/usr/games:/usr/local/games:/work/setup/lin/bin

2. 整体替换: new_var=${old_var-content},new_var=${old_var:-content}

liuwanpeng@ubuntu:~$ var_old=old
liuwanpeng@ubuntu:~$ var_new=${var_old-new}  // var_old已经设置,后面的new没有赋上,被赋值为var_old
liuwanpeng@ubuntu:~$ echo $var_new
old
liuwanpeng@ubuntu:~$ unset var_old
liuwanpeng@ubuntu:~$ var_new=${var_old-new}  // var_old没有设置,var_new被赋值new
liuwanpeng@ubuntu:~$ echo $var_new
new liuwanpeng@ubuntu:~$ var_old=""         // 虽为空字符,但是已设置
liuwanpeng@ubuntu:~$ var_new=${var_old-new} // var_old已设置,var_new=$var_old=空字符
liuwanpeng@ubuntu:~$ echo $var_new liuwanpeng@ubuntu:~$ var_new=${var_old:-new} // 冒号把“空字符“视为“未设置“
bash: ${var_old:-new}: bad substitution
liuwanpeng@ubuntu:~$ var_new=${var_old:-new}
liuwanpeng@ubuntu:~$ echo $var_new
new

shell及脚本1——变量的更多相关文章

  1. Linux Shell 01 脚本与变量

    一 脚本的创建和执行 1. 创建文件*.sh,文件后缀为sh 2. 编辑脚本 首行必须为:#!/bin/bash   #指定解释脚本的shell 3. 赋权 chmod u+x a.sh 4. 执行 ...

  2. shell脚本之变量与状态码

    目录: 前言 如何创建一个脚本 脚本调试 变量相关 变量的命令规则 bash中变量的种类 本地变量 环境变量 只读和位置变量 位置变量 查询变量 进程的退出状态与状态码 前言 在linux管理中,sh ...

  3. shell编程下 特殊变量、test / [ ]判断、循环、脚本排错

    第1章 shell中的特殊变量 1.1 $# $# 表示参数的个数 1.1.1 [示例]脚本内容 [root@znix ~]# cat /server/scripts/show2.sh #!/bin/ ...

  4. Shell中脚本变量的作用域

    原文地址:http://blog.csdn.net/abc86319253/article/details/46341839    在shell中定义函数可以使代码模块化,便于复用代码.不过脚本本身的 ...

  5. Shell脚本中变量和函数变量的作用域

    (1)Shell脚本中定义的变量是global的,其作用域从被定义的地方开始,到shell结束或被显示删除的地方为止.(2)Shell函数定义的变量默认是global的,其作用域从“函数被调用时执行变 ...

  6. shell中脚本变量和函数变量的作用域

    http://blog.csdn.net/ltx19860420/article/details/5570902 1. shell脚本中定义的变量是global的,其作用域从被定义的地方开始,到she ...

  7. 【转】shell编程下 特殊变量、test / [ ]判断、循环、脚本排错

    [转]shell编程下 特殊变量.test / [ ]判断.循环.脚本排错 第1章 shell中的特殊变量 1.1 $# $# 表示参数的个数 1.1.1 [示例]脚本内容 [root@znix ~] ...

  8. Linux基础-shell脚本知识整理和脚本编写----------变量、运算符、流程控制、函数、计划任务(发送邮件)

    I:知识整理:变量.运算符.流程控制.函数.计划任务 变量 系统变量:set:显示所有变量                env:环境变量 常用系统变量: path pwd lang home his ...

  9. [Z] Shell中脚本变量和函数变量的作用域

    在shell中定义函数可以使代码模块化,便于复用代码.不过脚本本身的变量和函数的变量的作用域问题可能令你费解,在这里梳理一下这个问题. (1)Shell脚本中定义的变量是global的,其作用域从被定 ...

随机推荐

  1. 使用VS Code从零开始开发调试.NET Core 1.0

    使用VS Code 从零开始开发调试.NET Core 1.0. .NET Core 是一个开源的.跨平台的 .NET 实现. VS Code 全称是 Visual Studio Code,Visua ...

  2. Redis命令拾遗三(列表List类型)

    本文版权归博客园和作者吴双本人共同所有.转载和爬虫请注明原文地址 Redis五种数据类型之列表类型 Redis五种数据类型之列表类型.你可以存储一个有序的字符串列表一类数据.比如你想展示你所存储的所有 ...

  3. 【无私分享:ASP.NET CORE 项目实战】目录索引

    简介 首先,我们的  [无私分享:从入门到精通ASP.NET MVC]   系列已经接近尾声,希望大家在这个过程中学到了一些思路和方法,而不仅仅是源码. 因为是第一次写博客,我感觉还是比较混乱的,其中 ...

  4. java Io文件输入输出流 复制文件

    package com.hp.io; import java.io.FileInputStream; import java.io.FileNotFoundException; import java ...

  5. 高性能 TCP & UDP 通信框架 HP-Socket v3.5.3

    HP-Socket 是一套通用的高性能 TCP/UDP 通信框架,包含服务端组件.客户端组件和 Agent 组件,广泛适用于各种不同应用场景的 TCP/UDP 通信系统,提供 C/C++.C#.Del ...

  6. Android 5.X新特性之RecyclerView基本解析及无限复用

    说到RecyclerView,相信大家都不陌生,它是我们经典级ListView的升级版,升级后的RecyclerView展现了极大的灵活性.同时内部直接封装了ViewHolder,不用我们自己定义Vi ...

  7. React Native 之生命周期

    前言 学习本系列内容需要具备一定 HTML 开发基础,没有基础的朋友可以先转至 HTML快速入门(一) 学习 本人接触 React Native 时间并不是特别长,所以对其中的内容和性质了解可能会有所 ...

  8. FrozenUI - 专注于移动web的UI框架

    http://frozenui.github.io/ 移动框架 重磅出击 简单易用,轻量快捷,为移动端服务的前端框架 开始使用 立即下载

  9. Microsoft Visual SourceSafe 6.0 无法关联项目

    最近遇到Microsoft Visual SourceSafe 6.0 安装好以后, 无法关联项目,导致无法进行版本控制,研究以后,发现需要运行一个程序,在安装目录下 ..\Visual Source ...

  10. The user specified as a definer ('root'@'%') does not exist 异常解决

    参考:http://www.cnblogs.com/Magicam/archive/2013/07/22/3207382.html 权限问题,授权 给 root  所有sql 权限 mysql> ...