mac终端上的bash命令

前端之家收集整理的这篇文章主要介绍了mac终端上的bash命令前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。

bash是shell的一种,linux现在默认的shell就是bash
在使用ubuntu 10.4.1开发android的时候,shell也要改成bash
mac os默认的shell也是bash,打开终端,默认就是bash

错误的理解

用户状态下输入bash就是进入bash,其实开打终端就是bash了,并不需要再输入bash进入,在bash-3.2$ 状态下输入的指令其实是bash脚本(交互式解释器)

Bourne-Again Shell简介

mac上的终端使用的是Bourne-Again Shell命令,简称bash

bash是GNU组织开发和推广的一个项目,是对Bourne shell的扩展

Bourne shell是 UNIX 最初使用的 Shell,作者Steven Bourne

bash是许多Linux平台的内定Shell,传统UNIX上还有许多Shell,包括tcsh、csh、ash、bsh、ksh

Shell Script大致都类同,一个Shell Script通常可以在很多种Shell上使用

狭义的Shell指的就是命令行终端

shell的作用:用户输入指令,通过Shell和内核沟通,控制硬件正常工作

基础

打开终端,在里面输入命令,一般终端已经帮你输入了“$”符号,只要输入具体命令就可以了

1.$echo

命令echo 表示:输出文本

$ echo "hello world"

输入结果:hello world

2.$cd

命令cd表示:进入某文件夹目录,或返回某目录

1)进入根目录

$ cd /

2)进入某目录(如下:进入bin目录)

$ cd bin   

3)返回到上层目录

$ cd ..

3)返回上上层目录(中间没用空格)

$ cd ../../

4)进入用户目录(~)

$ cd ~

3.$ls

命令ls表示:显示本层目录的所有文件文件

$ ls

当ls后面加上具体的目录时直接输入该文件夹的详细目录信息(比如bin目录如下)

$ ls bin

4.$whereis

命令whereis表示:查找某程序的路径(比如gcc如下)

$ whereis gcc

输入结果:/usr/bin/gcc

5.命令记忆功能

按上下键,可以查看使用过的所有命令

这些命令存储在用户目录.bash_history文件中:~/.bash_history

6.自动补全功能

1)按tab键,当再一串指令的第一个词后面,自动补全命令

2)按tab键,当再一串指令的第二个词后面,自动补全文件名或文件目录

3)连按两次tab键,(上面两种情况中,若再按一次tab键),则显示所有某些字母开头的命令,或本目录下的所有文件

7.命令别名功能:$alias

当一条命令太长,可以用alias命令为其他命令设置别名

例如,要查看本目录下的所有文件包括隐藏文件,用命令:

$ ls -al

为了方便记忆,可以为上面的命令取一个别名lsall,操作如下:

$ alias lsall='ls -al'

之后就可以用$lsall命令,来查看本目录下的所有文件

8.$man

命令man用于查看某命令的详细说明文件,(比如查看ls命令说明如下)

$ man ls     

退出时用输入q

9.$type

命令type用于判断某命令是不是bash内置命令,或是来自外部(例如cd命令和ls命令如下:)

$ type cd

输出"cd is a shell builtin",表示cd是bash内建命令

$ type ls

输出"ls is hashed (/bin/ls)",表示ls是外部命令,后面是程序路径

如果定义了一个命令的别名为lsall,此时用$type命令查看lsall

$ type lsall

输出"lsall is aliased to `ls -al'",表示lsall是ls命令的别名

10.跨行命令,转义命令执行键(转义回车键)

当输入一行太长的命令时,为了更清楚,可以先输入"",然后输入回车键,跳到下一行

下一行前面会出现">"符号,然后可以继续写没写完的命令

用两行输入完整的命令,例如:

$ cd /Users/xiaoa \回车

回车替换为回车符,会在下一样出现">",继续输入"/test"

/test

两行命令等于如下一行:

$ cd /Users/xiaoa/test

11.在bash中输入$bash命令,将启动一个子bash程序(进入子bash交互),用$exit命令退出子程序

**困惑**
bash子程序的意义是什么?既然在终端中就可以输入命令进行操作了,何必再启动一个bash子程序呢?
**解决**
$bash命令后面可以加参数(如用户,命令)或bash脚本文件名,把一些命令放到后台执行,这样就可以不进入交互模式而直接返回结果
类似于python的交互式和非交互式用法
bash有 交互式/非交互式 两种模式。bash只是一个比较知名的shell,还有 dash,zsh,fish,powershell
还有执行脚本语言的专用环境,它们的解释器也可以是交互模式/非交互模式,比如 python,nodejs。可以从bash进入这些解释器的交互模式,从bash进入bash当然也是其中一种情形。也可以从bash进入zsh,从zsh进入python。这是一个意料之外和意料之中的 feature,一致的适用性带来有趣效果

12.命令组合,与优先执行

用反单引号(就是键盘上方数字键1左边的键,不是单引号)包裹命令:`命令`

或$(命令),来优先执行某个命令,然后把返回的内容作为其他命令的输入,例子如下:

$ echo ls -a

$ echo $(ls -a)

上面的命令语句都有同样的作用:先用$ls命令获得本路径的所有文件包括.的文件,然后把返回的结果用$echo命令打印出来

一般用 $(命令) 先执行一段指令的比较多,因为反单引号太容易引起歧义

$()的作用是开启一个subshell,被它括起来的命令部分将优先执行

变量

1.什么是变量

x=200

等号左边的就是变量,等号右边的就是变量的内容

变量具有可变性

2.变量的作用

用简单的字符,来替代复杂的易于变动的内容

3.变量定义

$ testdata="is test"

这样就定义了一个变量testdata

使用变量时必须加上"$"符

$ echo $testdata

输出"is test"

输出时,需要附加其他的字符串,可以用${变量}

$ echo this is ${testdata}

输出"this is test"

4.取消变量设置

用$unset命令取消变量设置

$ unset testdata

命令unset后边直接跟变量名,注意没有"$"符号

5.变量定义规则

1)等号的左右两边都不能有空格

2)变量初始化的时候必须赋值,未赋值过的变量为空,但echo未赋值过的变量不会报错,没有任何输出

3)变量名只能由英文字母、数字和短下划线"_"组成,且开头字符不能是数字

4)当变量内容里有空白字符时,可用用双引号",或单引号',把内容包含起来

  但双引号内的特殊字符如$等保留原有特性,比如

$ testdata="home is $HOME"
$ echo $testdata

输出"home is /Users/a"

而单引号内的特殊字符则变为纯文本,比如

$ testdata='home is $HOME'
$ echo $testdata

输出"home is $HOME"

5)可以用""符来转义特色字符(比如回车符enter,$,܌空白字符,等)为一般字符

$ testdata=home is home
$ echo $testdata

上面转义了空白字符,所以不会报错,输出"home is home"

6.环境变量

1)用$env命令,查看所有已经定义过的环境变量,env是environment(环境)的缩写

$ env

用$export也可以查看

2)用$set命令,查看所有环境变量和自定义变量

$ set

3)区别于自定义变量,环境变量通常用大写字母表示,比如:PATH,HOME,MAIL,SHELL等

查看环境变量PATH

$ echo $PATH

PATH:是可执行文件路径,目录与目录之前用":"隔开,当执行某个命令或程序时,依据PATH定义的目录来搜索程序,排前的先搜索

RANDOM:代表随机数,介于0~32767之间

几种变量的含义

$#,$@,$0,$1,$2,$*,$$,$?
$# 是传给脚本的参数个数
$0 是脚本本身的名字
$1 是传递给该shell脚本的第一个参数
$2 是传递给该shell脚本的第二个参数
$@ 是传给脚本的所有参数的列表
$* 是以一个单字符串显示所有向脚本传递的参数,与位置变量不同,参数可超过9个
$$ 是脚本运行的当前进程ID号
$? 是显示最后命令的退出状态,0表示没有错误,其他表示有错误

@和*的区别

    相同点:都是引用所有参数
不同点:只有在双引号中体现出来。
假设在脚本运行时写了三个参数(分别存储在1 2 3)则"*" 等价于 “12 3"(传递了一个参数);而“@" 等价于 "1" "2" "$3"(传递了三个参数)</code></pre>

例子一

##dels.sh
echo "number:$#"
echo "scname:$0"
echo "first :$1"
echo "second:$2"
echo "argume:$@"
echo "show parm list:$*"
echo "show process id:$$"
echo "show precomm stat: $?"

执行结果

[@jihite]$ sh del.sh 1 2 3
number:3
scname:del.sh
first: 1
second:2
argume:1 2 3
show parm list:1 2 3
show process id:21057
show precomm stat: 0

例子二

#!/bin/sh
num=$#
name=$0
echo "number:$num"
echo "scname:$name"
echo $0
echo $1
echo $2

for ((i=0; i<$num; i++))
do
echo "$i"
done

echo "argume:$@"
for key in $@
do
echo $key
done
echo "-----------------"
for key in "$@"
do
echo $key
done
echo "-----------------------------"
for key2 in $
do
echo $key2
done
echo "-----------------"
for key2 in "$
"
do
echo $key2
done

echo "show process id:$$"
cho
echo "show precomm stat: $?"

执行结果

[@jihite]$ sh del.sh a b                                                      
number:2
scname:del.sh
del.sh
a
b
0
1
argume:a b
a
b
-----------------
a
b
-----------------------------
a
b
-----------------
a b
show process id:23582
del.sh: line 37: cho: command not found
show precomm stat: 127

问题:echo #0 #1 能不能用 $i 表示呢?

猜你在找的程序笔记相关文章