
shuf adalah utilitas command line seperti sort yang disertakan dalam Coreutils. Anda mungkin telah menebak bahwa ini digunakan untuk mengacak semu input yang diberikan dengan cara yang sama seperti Anda mengocok setumpuk kartu. Anda menebak dengan benar!
Di sini kita akan membahas perintah shuf beserta alternatifnya untuk berjaga-jaga jika Anda terjebak tanpa shuf.
Di mana mencari bantuan di shuf
Setelah Anda mengetahui apa itu shuf, langkah selanjutnya adalah mengetahui cara menggunakannya. Seperti kebanyakan utilitas command line, shuf hadir dengan opsi –help long.
Memerintah
# shuf --help
Usage: shuf [OPTION]... [FILE]
or: shuf -e [OPTION]... [ARG]...
or: shuf -i LO-HI [OPTION]...
Write a random permutation of the input lines to standard output.
With no FILE, or when FILE is -, read standard input.
Mandatory arguments to long options are mandatory for short options too.
-e, --echo treat each ARG as an input line
-i, --input-range=LO-HI treat each number LO through HI as an input line
-n, --head-count=COUNT output at most COUNT lines
-o, --output=FILE write result to FILE instead of standard output
--random-source=FILE get random bytes from FILE
-r, --repeat output lines can be repeated
-z, --zero-terminated line delimiter is NUL, not newline
--help display this help and exit
--version output version information and exit
Tiga Cara Shufu
Ada tiga cara untuk menggunakan perintah shuf yaitu:
- file shuf
- daftar shuf
- jarak shuf
Setiap cara memiliki kelebihannya masing-masing. Pengetahuan tentang semua cara sebelumnya dapat mengurangi kebutuhan untuk menggunakan perintah eksternal lainnya dalam hubungannya dengan perintah shuf.
file shuf
File shuf adalah cara shuf yang paling umum digunakan di command line. Ketika opsi -e atau -i tidak disertakan dalam opsi, shuf akan beroperasi sebagai file shuf. Artinya, input yang akan diacak akan berupa file apakah input standar atau file yang diberikan. Kata terakhir dalam daftar parameter mungkin berupa nama file. Jika parameter ini dihilangkan, file dianggap sebagai input standar dari shell atau disalurkan. A – dapat dimasukkan mengikuti konvensi bahwa input standar disimpulkan.
Di sini ikuti useran dan cara menentukan file dalam file shuf.
Penggunaan
Usage: shuf [OPTION]... [FILE]
Cara untuk menentukan file
Ada lebih dari satu cara untuk menentukan file menggunakan file shuf. Berikut adalah contoh perintah untuk setiap cara.
File implisit sebagai input standar
Dengan cara ini kita menghilangkan file dari argumen perintah shuf. Mengikuti konvensi, Anda dapat memilih untuk menyertakan – sebagai pengganti file untuk menunjukkan file yang akan diambil sebagai input standar.
perintah
{
seq 3 | shuf
}
Keluaran
1
3
2
Explicit file as standard input
perintah
{
seq 3 | shuf -
}
Keluaran
3
1
2
Catatan
(1) Menambahkan a – di akhir shuf berfungsi sebagai isyarat visual yang meningkatkan keterbacaan dalam skrip bash.
File as the name of file
Dengan cara ini, kami menentukan nama file sebagai file dalam argumen dari perintah shuf. Berikut ini beberapa contoh file shuf menggunakan file.
Acak jalur input dari terminal
perintah
{
shuf /dev/fd/1
}
asdf
sdf
df
f
Ctrl-D
Keluaran
df
f
asdf
sdf
Catatan
(1) Perintah shuf di atas shuf /dev/fd/1 sama dengan shuf –
(2) Penghentian jalur input melalui Ctrl-D diperlukan
Acak baris dalam file
perintah
{
seq 3 > file;
shuf file;
rm -f file
}
Keluaran
2
1
3
list shuf
Pada cara terakhir untuk shuf, kami mengoperasikan file atau input yang disalurkan ke perintah shuf. Dengan cara shuf ini, kami mengizinkan baris input untuk ditentukan sebagai argumen dari perintah shuf menggunakan opsi -e, memaksa shuf untuk beroperasi sebagai daftar shuf.
Penggunaan
Usage: shuf -e [OPTION]... [ARG]...
Cara untuk menentukan argumen daftar
Ketik masukan sebagai argumen
perintah
{
shuf -e 1 2 3
}
Keluaran
1
3
2
Catatan
(1) above shuf command shuf -e 1 2 3 is equivalent to seq 3 | shuf –
Variable as args
perintah
{
var="1 2 3";
shuf -e ${var}
}
<strong>Output</strong>
[cc lang="bash"]
3
1
2
Ekspansi parameter sebagai argumen
perintah
{
shuf -e {1..3}
}
Keluaran
1
2
3
Command substitution as args
perintah
{
shuf -e $( seq 3 )
}
Keluaran
3
2
1
range shuf
Cara shuf yang terakhir ini tidak seperti cara-cara sebelumnya yang diperkenalkan. Alih-alih menentukan file atau argumen di command line, itu membutuhkan rentang bilangan bulat. Opsi -i, memaksa shuf untuk beroperasi sebagai range shuf.
Range shuf menghasilkan rentang bilangan bulat dalam urutan acak.
Penggunaan
Usage: shuf -i LO-HI [OPTION]...
Cara untuk menentukan jangkauan
Satu-satunya cara: LO-HI
perintah
{
shuf -i 1-3
}
Keluaran
2
3
1
Catatan
(1) Perintah shuf shuf -i 1-3 setara dengan semua perintah sebelumnya menggunakan urutan 1 2 3
Opsi shuf tingkat lanjut
Berikut adalah beberapa opsi lanjutan untuk shuf yang mungkin berguna dalam pemrograman bash.
Limit number of output lines
Untuk membatasi jumlah baris dalam output, kami menggunakan opsi -n diikuti oleh bilangan bulat sebagai berikut.
perintah
{
shuf -i 1-3 -n 1
}
Keluaran
3
Catatan
- Perintah shuf shuf -i 1-3 -n 1 setara dengan shuf -i 1-3 | kepala -1
Specify a file to write output lines
Untuk menentukan file untuk menulis baris output, kami menggunakan opsi -o diikuti dengan nama file sebagai berikut.
perintah
{
shuf -i 1-3 -n 1 -o file;
cat file;
rm -f file
}
Keluaran
1
Catatan
(1) File perintah shuf shuf -i 1-3 -n 1 -o setara dengan shuf -i 1-3 -n 1 > file menggunakan pengalihan I/O
Stream output lines
Untuk membuat aliran garis keluaran yang berkelanjutan, kami menggunakan opsi -r sebagai berikut.
perintah
{
shuf -e {0,1} -r | xargs -i echo -n "{}"
}
Keluaran
000101101010101101010110000101111010001010111001110…
Use the zero byte instead of newline as line delimiter
Untuk menggunakan garis yang diakhiri nol, kami menggunakan opsi -z sebagai berikut.
perintah
{
seq 3 | tr 'n' ' ' | shuf -z
}
Keluaran
213
Catatan
(1) Output berisi nol byte non-cetak di antara digit
Cara mengocok di bash dengan cara mudah
Cara mudah untuk shuf adalah dengan menggunakan perintah shuf seperti yang dibahas di atas. Namun, jika Anda sedikit penasaran tentang bagaimana Anda akan mengocok jika tidak menggunakan perintah eksternal lain atau bahkan bash murni, baca terus.
Cara mengocok dengan cara yang sulit
Saya telah menyusun daftar cara sulit untuk mengocok. Jangan khawatir mereka tidak terlalu sulit. Mereka hanya tidak menggunakan perintah shuf.
Using sort
Alternatif umum untuk menggunakan file shuf adalah dengan menggunakan perintah sort. Berikut caranya:
perintah
{
seq 3 | sort -r
}
Keluaran
2
3
1
Catatan
(1) Deret shuf 3 | sort -r setara dengan shuf -i 1-3
(2) shuf -i 1-3 lebih cepat
Using gawk
Alternatif lain untuk menggunakan file shuf adalah dengan menggunakan perintah gawk. Berikut caranya:
Naskah
gawk-shuf() {
gawk -v random=${RANDOM} '
function randInt() {
return int(rand()*1000)
}
function case_numeric_compare(i1, v1, i2, v2, l, r) {
l = int(v1)
r = int(v2)
if(l<r) return -1
else if(l==r) return 0
else return 1
}
BEGIN {
count=1
srand(random)
}
{
rank[count]=randInt()
line[count]=$(0)
count++
}
END {
asorti(rank,order,"case_numeric_compare")
for(i=0;i<count;i++) {
print line[order[i]]
}
}
' -
}
if [ ${#} -eq 0 ]
then
true
else
exit 1 # wrong args
fi
gawk-shuf
Sumber: gawk-shuf.sh
perintah
{
seq 3 | bash gawk-shuf.sh
}
Keluaran
2
3
1
Catatan
(1) Anda juga dapat menggunakan awk
(2) gawk-shuf.sh harus ada di direktori kerja perintah
Pure bash
Naskah
pure-bash-shuf() {
local line
local -a lines
while read -r line
do
lines[RANDOM]=${line}
done
for line in ${lines[@]}
do
echo ${line}
done
}
if [ ${#} -eq 0 ]
then
true
else
exit 1 # wrong args
fi
pure-bash-shuf
Sumber: pure-bash-shuf.sh
perintah
{
seq 3 | bash pure-bash-shuf.sh
}
Keluaran
2
3
1
Catatan
- Skrip di atas tidak menangani kasus di mana RANDOM terjadi lebih dari sekali. Itu dibiarkan sebagai latihan.
dJackblck17 Game
Saya telah menyusun awal permainan kartu yang disebut Jackblck17 berdasarkan blackjack untuk tujuan menunjukkan perintah shuf dalam tindakan.
Naskah
deck() {
echo {A,2,3,4,5,6,7,8,9,10,J,Q,K}-{club,diamond,heart,spade}
}
banner() {
cat << EOF
bbbbbbbb
jjjj b::::::b lllllll kkkkkkkk 1111111 77777777777777777777
j::::j b::::::b l:::::l k::::::k 1::::::1 7::::::::::::::::::7
jjjj b::::::b l:::::l k::::::k 1:::::::1 7::::::::::::::::::7
b:::::b l:::::l k::::::k 111:::::1 777777777777:::::::7
jjjjjjj aaaaaaaaaaaaa ccccccccccccccccb:::::bbbbbbbbb l::::l
cccccccccccccccc k:::::k kkkkkkk 1::::1 7::::::7
j:::::j a::::::::::::a cc:::::::::::::::cb::::::::::::::bb
l::::l cc:::::::::::::::c k:::::k k:::::k 1::::1 7::::::7
j::::j aaaaaaaaa:::::a c:::::::::::::::::cb::::::::::::::::b l::::l
c:::::::::::::::::c k:::::k k:::::k 1::::1 7::::::7
j::::j a::::ac:::::::cccccc:::::cb:::::bbbbb:::::::b l::::l
c:::::::cccccc:::::c k:::::k k:::::k 1::::l 7::::::7
j::::j aaaaaaa:::::ac::::::c cccccccb:::::b b::::::b l::::l c::::::c
ccccccc k::::::k:::::k 1::::l 7::::::7
j::::j aa::::::::::::ac:::::c b:::::b b:::::b l::::l c:::::c k:::::::::::k
1::::l 7::::::7
j::::j a::::aaaa::::::ac:::::c b:::::b b:::::b l::::l c:::::c
k:::::::::::k 1::::l 7::::::7
j::::ja::::a a:::::ac::::::c cccccccb:::::b b:::::b l::::l c::::::c
ccccccc k::::::k:::::k 1::::l 7::::::7
j::::ja::::a a:::::ac:::::::cccccc:::::cb:::::bbbbbb::::::bl::::::lc:::::::
cccccc:::::ck::::::k k:::::k 111::::::111 7::::::7
j::::ja:::::aaaa::::::a c:::::::::::::::::cb::::::::::::::::b l::::::l
c:::::::::::::::::ck::::::k k:::::k 1::::::::::1 7::::::7
j::::j a::::::::::aa:::a cc:::::::::::::::cb:::::::::::::::b
l::::::l cc:::::::::::::::ck::::::k k:::::k 1::::::::::1 7::::::7
j::::j aaaaaaaaaa aaaa ccccccccccccccccbbbbbbbbbbbbbbbb
llllllll cccccccccccccccckkkkkkkk kkkkkkk11111111111177777777
j::::j
jjjj j::::j
j::::jj j:::::j
j::::::jjj::::::j
jj::::::::::::j
jjj::::::jjj
jjjjjj
EOF
}
score() {
case ${1} in
A) echo 0 ;;
[2-9]|10) echo ${1} ;;
J|Q|K) echo 10 ;;
esac
}
score-hand() {
local card
local points
local -i candidate_points
local -i aces
aces=0
for card in ${hand}
do
let points+=$( score ${card/-*/} )
test ! "${card/-*/}" = "A" || {
let aces+=1
}
done
test ! ${aces} -le 0 || {
echo ${points}
}
while [ ${aces} -gt 0 ]
do
for point in ${points}
do
new_point=""
for ace in 1 11
do
candidate_points=$(( point + ace ))
test ! ${candidate_points} -le 21 || {
echo "${candidate_points}"
new_points="${new_points} ${candidate_points}"
}
done
done
let aces-=1
points="${new_points}"
done | sort -nur | head -1
}
jackblck17() {
local deck
local card
local -i turn
local hand
deck=$( shuf -e $( deck ) )
banner
echo -e " Press enter key to continue"
read
turn=1
for card in ${deck}
do
test ! ${turn} -gt 2 || {
echo -e "nhit or stay? (h) or s "
read
test ! "${REPLY}" = "s" || {
break
}
}
echo -e "n Your hand: n"
hand="${hand} ${card}"
echo " ${hand}"
test ! $( score-hand ) -gt 21 || {
echo -e "nBust!n"
exit
}
let turn++
sleep 1
done
echo -e "Dealer's hand: 17n"
echo -e "Your hand: $( score-hand )n"
test ! $( score-hand ) -gt 17 && {
echo -e "Dealer winsn"
true
} || {
echo -e "You win!n"
}
}
if [ ${#} -eq 0 ]
then
true
else
exit 1 # wrong args
fi
jackblck17
Sumber: jackblck17.sh
perintah
bash jackblck17.sh
Keluaran
bbbbbbbb
jjjj b::::::b lllllll kkkkkkkk 1111111 77777777777777777777
j::::j b::::::b l:::::l k::::::k 1::::::1 7::::::::::::::::::7
jjjj b::::::b l:::::l k::::::k 1:::::::1 7::::::::::::::::::7
b:::::b l:::::l k::::::k 111:::::1 777777777777:::::::7
jjjjjjj aaaaaaaaaaaaa ccccccccccccccccb:::::bbbbbbbbb l::::l
cccccccccccccccc k:::::k kkkkkkk 1::::1 7::::::7
j:::::j a::::::::::::a cc:::::::::::::::cb::::::::::::::bb l::::l
cc:::::::::::::::c k:::::k k:::::k 1::::1 7::::::7
j::::j aaaaaaaaa:::::a c:::::::::::::::::cb::::::::::::::::b l::::l
c:::::::::::::::::c k:::::k k:::::k 1::::1 7::::::7
j::::j a::::ac:::::::cccccc:::::cb:::::bbbbb:::::::b l::::l
c:::::::cccccc:::::c k:::::k k:::::k 1::::l 7::::::7
j::::j aaaaaaa:::::ac::::::c cccccccb:::::b b::::::b l::::l
c::::::c ccccccc k::::::k:::::k 1::::l 7::::::7
j::::j aa::::::::::::ac:::::c b:::::b b:::::b l::::l
c:::::c k:::::::::::k 1::::l 7::::::7
j::::j a::::aaaa::::::ac:::::c b:::::b b:::::b l::::l
c:::::c k:::::::::::k 1::::l 7::::::7
j::::ja::::a a:::::ac::::::c cccccccb:::::b b:::::b l::::l
c::::::c ccccccc k::::::k:::::k 1::::l 7::::::7
j::::ja::::a a:::::ac:::::::cccccc:::::cb:::::bbbbbb::::::bl::::::lc
:::::::cccccc:::::ck::::::k k:::::k 111::::::111 7::::::7
j::::ja:::::aaaa::::::a c:::::::::::::::::cb::::::::::::::::b l::::::l
c:::::::::::::::::ck::::::k k:::::k 1::::::::::1 7::::::7
j::::j a::::::::::aa:::a cc:::::::::::::::cb:::::::::::::::b l::::::l
cc:::::::::::::::ck::::::k k:::::k 1::::::::::1 7::::::7
j::::j aaaaaaaaaa aaaa ccccccccccccccccbbbbbbbbbbbbbbbb
llllllll cccccccccccccccckkkkkkkk kkkkkkk11111111111177777777
j::::j
jjjj j::::j
j::::jj j:::::j
j::::::jjj::::::j
jj::::::::::::j
jjj::::::jjj
jjjjjj
Press enter key to continue
Your hand:
3-heart
Your hand:</span>
3-heart 4-spade
hit or stay? (h) or (s)
Your hand:
3-heart 4-spade 9-heart
hit or stay? (h) or s
s
Dealer's hand: 17
Your hand: 16
Dealer wins
Intinya pada shuf di bash
Dalam tutorial ini, kami membahas semua yang perlu Anda ketahui tentang perintah shuf dan banyak lagi. Anda tidak lagi harus menghasilkan untuk melakukan hal-hal dengan cara yang sulit, sekarang Anda memiliki shuf.
Sejujurnya, sebelum menulis ini, saya hanya tahu sedikit bahwa ada perintah yang disebut shuf yang dapat digunakan untuk mengacak urutan input yang diberikan. Setelah menyelam jauh ke dalam perintah shuf untuk pemrograman bash, Sekarang, saya dapat dengan jujur mengatakan bahwa itu sepadan; shuf lebih berguna dari yang saya kira.
Saya harap Anda menikmati membaca ini sama seperti saya menikmati menulisnya dan itu membantu Anda dalam karir atau pekerjaan rumah Anda. Jika ya, beri tahu saya.
Terima kasih,